В языке Си существует два способа доступа к переменной: ссылка на переменную и использование механизма указателей. Указатель - переменная (указатель) - переменная, предназначенная для хранения адреса в памяти. Указатель - константа - значение адреса ОП.
Определены две операции для доступа к переменным через указатели: " & " и " * ";
операция & - присвоить значение адреса;
операция * - выбрать содержимое из адреса.
Признаком переменной-указателя для компилятора является наличие в описании:
1) типа объекта, для доступа к которому используется указатель;
2) символа * перед переменной:
int var1, *prt;
Такое объявление приводит к появлению переменной var1 типа int и указателя на тип int, т.е. "указатель на целое". Место, выделяемое для него транслятором, зависит от модели памяти (может быть 2 или 4 байта).
Унарная операция & дает возможность присвоить адрес переменной указателю, т.е. у= &х, присваивает адрес х как содержимому переменной указателя у (рис.4.2).
Операцию & можно применять только к переменным и элементам массива. Недопустимы у=&(x+7), &25 .
Унарная операция * воспринимает свой операнд как адрес некоторого объекта и
использует его для выборки содержимого, если у = &х; z = *y; => z = х; (рис4.3)
Указатели могут встречаться в выражениях, как и любая другая переменная. Допустимы
выражения:
*у = 7; - в ячейку с адресом *у занести 7;
*х* = 5; - содержимое с адресом *х увеличить в пять раз;
(*z)++; - добавить 1 к содержимому с адресом *z.
Рис.4.2.Схема образования ссылки на переменную
y
|
|
Значение х
(или *у)
|
Рис.4.3.Схема извлечения значения по ссылке на переменную
Характерно, что указатели можно использовать в арифметических операциях. Например: если - указатель, то операция у++ увеличивает его значение на одну длину типа указателя. Транслятор будет масштабировать приращение адреса в соответствии с типом, заданным в объявлении указателя. После выполнения операции у++, у будет указывать на следующий элемент данного типа. Это свойство в языке Си используется при работе со структурированными данными.