Указатели

Указатели – это переменные, значениями которых служат адреса участков памяти, выделенных для объектов конкретных типов. Различают три вида указателей – указатели на объекты, на функции и на void. Кроме того, различают указатели-переменные и указатели-константы. В простейшем случае определение указателя-переменной на некоторый объект имеет вид

тип *[const] имя [инициал_выр];

где звездочка относится непосредственно к имени. Например,

char *t1, *t2, t3; // t1, t2 -неинициализированные указатели на объекты типа char (то есть в переменных t1, t2 может храниться адрес объекта типа char), a t3 – переменная типа char;

const int *t1; указатель на константу целого типа.

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

- явно заданный адрес участка памяти,
char *p1= (char *) 0xb8000000; // обратите внимание на необходимость преобразования числового значения к типу указателя (char *).

- пустое значение (NULL),
char *p2 =NULL; // нулевой указатель на объект типа char. Если значение константного выражения равно нулю, то это нулевое значение преобразуется к пустому (иначе нулевому, NULL) указателю. Нулевой указатель отличен от указателя на любой объект.

- выражение, позволяющее получить адрес объекта с помощью операции ‘&’,
char c = 'a';
char* const p3 = &c;//указатель в p хранится адрес c

- указатель, уже имеющий значение,
char *p4=p3; // в p4 также хранится адрес c.

Кроме того инициализировать указатель можно с помощью операции динамического выделения участка памяти new. Например,

char *p5= new char; //выделили память для перемененной типа char и связали указатель p с эти участком памяти.

Таким образ выделенная память должна быть освобождена с помощью операции delete. В противном случае одна будет занята до перезагрузки операционной системы (Это проблема называется проблемой «динамического мусора»). Например, delete p5;

Основная операция над указателем – разыменование, унарная операция ‘*’ (получение значения через указатель). Эта операция также называется косвенным обращением или обращением по адресу. Например,

char d=*p3;// значением переменной d будет значение того участка памяти, с которым связан указатель p3, то есть d=c= ‘a’.

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

*p3= ‘b’; // значением переменной с стал символ ‘b’.

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

Над указателями-переменными можно также осуществлять операции присваивания, сложение с константой, вычитание, --, ++, сравнение, приведение типов.

Если указатель описан со спецификатором const (то есть является константой-указателем), то он должен быть инициирован и его значения нельзя будет изменить с помощью приведенных выше операций. Например,

char * const p6=p5;

Указатель на void применяется в тех случаях, когда конкретный тип объекта, адрес которого следует хранить, не определен. Таким указателям можно присвоить значение указателя любого типа, а также сравнивать его с любыми указателями.

Ссылки

Ссылка представляет собой синоним имени, уже существующего объекта, и поэтому не занимает место в памяти (в отличии от указателя). Формат описания:

тип & имя инициализатор;

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

int a=10;

int& a1=a;

cout<<a<<a1;

a1+=2;

cout<<a<<a1;

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: