Операции для работы с указателями
Для работы с указателями используют два оператора - оператор получения адреса (&) и оператор косвенной адресации или (разыменования) раскрытия ссылки (*). 1.1.1. Операция получения адреса (&) Оператор &, это унарный оператор (с одним операндом), возвращающий адрес операнда в памяти. int *m; m = &count; //Переменной m присвоить адрес, по которому расположена переменная count; В переменную m мы записываем адрес переменной count. Адрес представляет собой адрес ячейки памяти, в которой размещена переменная. Адрес и значение переменной – совершенно разные понятия. Выражение «&переменная» означает «адрес переменной». Унарная операция получения адреса & применима к величинам, имеющим имя и размещенным в оперативной памяти. Таким образом, нельзя получить адрес скалярного выражения, неименованной константы или регистровой переменной. 1.1.2. Операция раскрытия ссылки (*) Оператор косвенной адресации или раскрытия ссылки (*) – это унарный оператор. Он возвращает значение объекта, расположенного по указанному адресу. int *m, q; m = &count; //Переменной m присвоить адрес, по которому расположена переменная count q = *m; //запись значения переменной count в переменную q;
int ir; int pir = &ir; //инициализация указателя при объявлении;
В примере 2 операторы & и * используются для записи значения 10 в переменную tag.
Разыменование (dereferencing) означает получение содержимого памяти, на которое ссылается указатель. Как видите, оператор разыменования используется как для объявления указателя (int *pm;), так и для взятия значения объекта, на который ссылается указатель (tag = *pm;). По контексту можно определить, как должен использоваться оператор в каждом конкретном случае. Вам не нужно беспокоиться о том, что компилятор не поймёт ваших намерений. С точки зрения синтаксиса языка безразлично, где будет находиться пробел – справа или слева от символа *. Синтаксис С++ допускает различные стили написания программ: можно ставить оператор разыменования сразу за типом данных при объявлении указателя и непосредственно перед указателем при взятии значения объекта: int* x; char* s = new char[256]; int z = *x; SomeClass temp = *aClass; или ставить оператор перед именем переменной: int *x; // и даже более того int * x; Эту операцию можно использовать как для получения, так и для изменения значения величины (если она не объявлена как константа). Конструкцию *имя_указателя можно использовать в левой части оператора присваивания, так как она является L-значением, то есть определяет адрес области памяти. Для простоты эту конструкцию можно считать переменной, на которую ссылается указатель. С ней допустимы все действия, определенные для величин соответствующего типа (если указатель инициализирован). На одну и ту же область памяти может ссылаться несколько указателей различного типа. Примененная к ним операция разадресации дает разные результаты.
|