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

Указатель — это специальная переменная, которая хранит адрес другой переменной. Указатель объявляется следующим образом:

тип * переменная;

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

int t.

Объявление и инициализация

int *p= &t;

означают следующее. В переменной p будетхраниться не обрабатываемое программой целое число (оценка студента, количество выпущенной продукции и т. п.), а адрес ячейки, в которой будет находиться информация указанного типа (целое число). Под адресом будем понимать номер первого байта выделенного для переменной участка оперативной памяти в шестнадцатеричной системе счисления. Для переменных, не являющихся указателями, без дополнительного объявления адрес также запоминается системой, и его можно получить с помощью операции & (разадресации), например, &t. Эта унарная операция, которую иногда называют “взятие адреса”, ничего не делает со значением переменной t.

До первого использования переменная – указатель обязательно должна быть проинициализирована. До тех пор, пока не определим значение указателя, он относится к чему-то случайному в памяти, и его использование может привести к непредсказуемым результатам. Один из способов показан выше и означает, что в переменную p помещается адрес ячейки t. Важно понять, что приведённая выше запись равносильна

int *p; и p=&t; (а не *p=&t;)

В этом заключается одна из трудностей начального этапа изучения указателей. Эта тема усложняется ещё и тем, что такой же символ “ & ” используется при объявлении переменной ссылочного типа. Здесь этот символ определяет операцию взятия адреса для переменной и никакого отношения к ссылочному типу не имеет.

Заметим, что расстановка пробелов при объявлении указателей свободная. Наряду с приведенными выше допустимы также следующие записи:

int * p= & t; int* p= &t;.

Предпочтение следовало бы отдать последней записи, так как она подчёркивает, что объявляется переменная p, а не *p. Из такой записи легче понять смысл указателя. Она показывает, что типом является int*, а не int. Из синтаксических правил необходимо обратить также внимание на следующее. Если в одной строке объявляется несколько указателей, то символ “*” надо писать перед каждой переменной: float* q1, *q2;

Содержимое ячейки, адрес которой находится в p, в тексте программы обозначается с помощью операции разыменование. Для неё используется тот же символ “*”, что и при объявлении переменной-указателя. Эта унарная операция возвращает значение переменной, находящейся по указанному адресу. Поэтому *p — это обрабатываемое программой целое число, которое находится в ячейке, адрес которой в переменной-указателе p. С учётом инициализации (p=&t) *p и t — это одно и тоже значение. Поэтому если с помощью cin>>t введём, например, число 2 и выполним *p*=5, что равносильно *p=*p*5, то изменится и величина t, хотя, казалось бы, не было явного её изменения. Поэтому оператор cout << t; выведет число 10 (2*5). И, наоборот, изменив t (например, t++;) этим самым мы изменим и значение *p. С помощью cout<<(*p) выведем 11.

Сказанное выше будем обозначать следующим образом:

p (или &t) *p (или t)

 
 


В “левом прямоугольнике” (ячейке памяти) находится адрес, а в ячейке “справа” — обрабатываемое целое число. Этот рисунок объясняет термин “указатель”.

Заметим, что рассматриваемые здесь операции “&” и ”*” являются унарными и имеют более высокий приоритет по сравнению с аналогичными бинарными операциями “битовое и” и арифметическое умножение.

Для *p определены те же операции, что и для переменной указанного типа, у нас для целых чисел. Поэтому допустимы, например, следующие операторы:

а) cin>>(*p); б) int r; r=*p*2; в) if (*p%2) …; г) cout<<(*p);

Можно также выводить значение переменной-указателя. После выполнения cout<<p; будет выведен адрес в шестнадцатеричной системе счисления. При этом он не обязательно будет одинаковым при повторном выполнении одной и той же программы.


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



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