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

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

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

До первого использования переменная-указатель обязательно должна быть проинициализирована. До тех пор, пока не определим значение указателя, он относится к чему-то случайному в памяти, и его использование может привести к непредсказуемым результатам. Один из способов показан выше и означает, что в переменную p помещается адрес ячейки t. Важно понять, что int* 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 — это одно и то же значение. Значит, если с помощью cint; введём, например, число 2 и выполним *p*=5; или *p=*p*5; то изменится и величина t, хотя, казалось бы, не было явного её изменения. Поэтому оператор cout

Сказанное выше будем обозначать так:

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

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

Адреса и указатели в Си. Адресная арифметика


Читать еще…

Понравилась статья? Поделиться с друзьями: