Будем рассматривать операции как примеры обращения по ссылке к статическим данным:
1. Взятие адреса или операция адресация: для того, чтобы связать ссылочную переменную со значением некоторого элемента памяти необходимо этой переменной присвоить адрес. Для взятие адреса используются операция: @, которая ставится перед переменной, адрес который необходимо получить. Унарная операция.
Пример:
Var
I:integer;
P:^integer;
Begin
……
I:=7;
P:=@i;
В этом случае переменная p будет ссылаться по адресу на область памяти, связанную с переменной i. Для того, чтобы ссылка и указатель ни на что не указывали или присваивается пустое значение,которое обозначается служебном словом Nil: p:Nil. Перед использованием ссылочных переменных и указателей необходимо следить за тем, чтобы они были проинициализированы доступными и логически верными значениями адресов. Неправильная инициализация может привести к непредсказуемым результатам.
2. Разыменование или раз адресация: является основной операцией работы с указателями, суть заключается в том, чтобы взять или поместить некоторое значение по адресу Ю находящихся в ссылочной переменной: ^, который ставиться после ссылочной переменной Пример:
Var
I:integer;
P:^integer;
Begin
……
I:=7;
P:=@i;
P^:=2;
Wrieln(p^);
Writeln(i);
При выполнение операции разыменования важную роль играет базовый тип, он указывает какой объем памяти буде обрабатываться и с каким типом будет работать.
Операция разыменования к указателям типа pointer.
Пример:
Var
I:integer;
P:pointer;
Begin
……
I:=7;
P:=@i;
P^:=2;
Writeln(p^); (x)
Данные операции могут быть выполнены, так как указатель типа pointer не обладает информацией о том, с каким объемом памяти надо работать. Поэтому при использовании типа pointer для обращения к данным необходимо произвести приведение типов, который укажет какой объем данных необходимо обрабатывать
Integer (p^):=2;
Writeln(integer(p^));
При работе с ссылками необходимо ввести четкий контроль за сохранением соответствия базовым типом ссылочной переменной и базовым типом переменной, на данные которые эта ссылка ссылается. Несоответствие типов может привести к нежелательным результатам:
a)
var
I,j,k:byte;
P1,p2:^byte;
Begin
I:=1;j:=2;k:=3;
P1:=@i; p2:=@j;
Writeln (p1^); 1
Writeln(p2^); 2
b) var
I,j,k:byte;
P1,p2:^integer;
Begin
I:=1;j:=2;k:=3;
P1:=@i; p2:=@j;
Writeln (p1^); 513
Writeln(p2^); 770
3. Присваивание ссылочной переменных и указателей.
При выполнение данной операции необходимо чтобы ссылки были совместны по типу. Операция прямого присваивания приводят к копированию адреса из одной ссылочной переменной в другую
Var
I,j:byte;
P1,p2:^byte;
……
P1:=@i;
P2:=@j;
P1:=p2;