Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
С_глава1.doc
Скачиваний:
2
Добавлен:
16.12.2018
Размер:
548.86 Кб
Скачать

Занятие 3. Указатели. Ссылки. Массивы. Работа со строками.

Теоретическая часть.

Указатели

Когда компилятор обрабатывает оператор определения переменной, например, int j=10;, он выделяет память в соответствии с типом (int) и инициализирует ее указанным значением (10). Все обращения в программе к переменной по ее имени (j) заменяются компилятором на ее адрес области памяти, в которой хранится значение переменной. Адресом участка оперативной памяти является номер байта с которого начинается этот участок. Программист может определить собственные переменные для хранения адресов областей памяти. Такие переменные называются указателями. Указатель – это переменная, которая содержит адрес другой переменной или функции. Описание указателя

тип_ данных *имя_указателя;

Звездочка относится непосредственно к имени_указателя, поэтому, чтобы объявить несколько указателей, требуется ставить ее перед каждым именем.

Примеры объявления указателей.

1) int *pi, a, b, *pk; // Объявляются две целых переменных a и b, и два указателя pi и pk на // переменные целого типа

2) double *pa, b; // Объявление переменной b типа double и указателя pa на тип double

3) char *ptext; // Объявление указателя ptext на переменную типа char

Операции разыменования и взятия адреса

Символ звездочка используется не только для объявления указателя, но и как оператор разыменования для доступа к содержимому области памяти, на которую указывает указатель. Компилятор по контексту определяет, как именно должен использоваться символ звездочка.

Примеры разыменования указателей.

1)*pi=5; // Присваивает значение 5 переменной по адресу в указателе pi

2)*ptext=’h’; // Присваивает значение ‘h’ переменной по адресу в указателе ptext

Объявление указателя выделяет память для него, но пока ему не присвоено никакое значение, он ни на что не указывает. Для получения адреса какого-либо объекта используется операция взятия адреса &.

Пример использования операции взятия адреса.

сhar cval, *pc;

int ival, *pi;

pc=&cval; // Указатель pc содержит адрес переменной cval

pi=&ival; // Указатель pi содержит адрес переменной ival

Инициализация указателей

При объявлении указателя надо стремиться выполнить его инициализацию, то есть присвоение начального значения. Рассмотрим некоторые способы инициализации указателей.

Присваивание указателю адреса существующего объекта:

с помощью операции получения адреса:

int a=5; // Объявление целой переменной

int *p=&a; // В указатель записывается адрес a

с помощью значения другого инициализированного указателя:

int *r=p; или int *r; r=p;

2. Присваивание пустого значения:

float *r=NULL; или float *r=0;

Арифметические операции с указателями

С указателями могут быть использованы операции инкремента (++), декремента (--), сложения (+), вычитания (-); операции сравнения, присваивания. Если к указателю применяются операции ++ или --, то указатель увеличивается или уменьшается на размер объекта, на который он указывает, что условно можно представить так:

тип *ptr;

ptr++ = содержимое_ptr+sizeof(тип)

ptr-- = содержимое_ptr-sizeof(тип)

где типом может быть любой основной тип языка C++ или тип введенный пользователем.

Операции сложения или вычитания можно применять к указателю, если вторым операндом будет целое число. Целое число складывается с указателем или вычитается из него следующим образом:

тип *ptr;

int n;

ptr+n=содержимое_ptr+n*sizeof(тип)

ptr-n =содержимое_ptr-n*sizeof(тип)

Один указатель можно вычитать из другого, если они оба указывают на один и тот же объект. Если, например, два указателя ссылаются на разные элементы массива, вычитание одного указателя из другого позволяет получить количество элементов массива, находящихся между двумя заданными. К указателям можно применять только описанные операции. Следующие операции недопустимы с указателями:

сложение двух указателей;

вычитание двух указателей на различные объекты;

сложение указателей с числом с плавающей точкой;

вычитание из указателей числа с плавающей точкой;

умножение и деление указателей.