Указатели. Операции над указателями
Присваивание
При выполнении этой операции указателю присваивается значение другого указателя или nil.Допускается присваивать указателю только значение того же или неопределенного типа.
Например:
Var р1, р2: ^integer;р3: ^real;
р: pointer;
{допустимые операции}
p1:=p2; р:=р3; р1:=р;
p1:=nil; р:=nil;
{недопустимые операции}
р3:=р2; p1:=p3;
Например:
Var i: integer;
pi: ^integer;
...
pi:=@i; { указатель pi будет содержать адрес переменной i }
Операция доступа к данным по указателю (операция разыменования) необходима, чтобы получить доступ к переменной по указателю, необходимо после переменной – типизированного указателя поставить знак «^». Полученное значение имеет тип, совпадающий с базовым типом указателя. Нетипизированные указатели разыменовывать нельзя.
Например:
j:=pi^; {переменной j присваивается значение целого, расположенного по адресу pi }
pi^:=pi^+2; {целое значение, расположенное по адресу pi, увеличивается на 2 }
Из всех возможных операций отношения допускаются только операции проверки
1. равенства (=)
2. и неравенства (< >).
Эти операции проверяют соответственно равенство и неравенство адресов.
Например:
sign:= pl=p2; { переменная sign логического типа получает значение true или false в зависимости от значений указателей }
if p1 <> nil then ... { проверка адреса }
Указатель на указатель
Поскольку в качестве базового типа типизированного указателя может быть использован любой тип, допустимо определять «указатель на указатель».
Например, для реализации схемы, изображенной на рисунке, переменную ppi описать и инициализировать следующим образом:
Const i: integer=1;
Var pi: ^integer;
ppi: ^pi;
...
pi:=@i;
ppi:=@pi; ...
Для получения значения переменной i необходимо дважды применить операцию разыменования. В нашем случае ppi^^ имеет тип integer и равно 1.
Функции, работающие с указателями
Функция ADDR(x): pointer
возвращает адрес объекта х, в качестве которого может быть указано имя переменной, функции, процедуры.
Выполняет те же действия, что и операция «@».
Функция SEG(x): word
возвращает сегментный адрес указанного объекта.
Функция OFS(x): word
возвращает смещение указанного объекта.
Функция CSEG(x): word
возвращает текущее значение сегментного регистра CS – сегментный адрес сегмента кодов.
Функция DSEG: word
возвращает текущее значение сегментного регистра DS – сегментный адрес сегмента данных.
Функция PTR(seg, ofs: word):pointer
возвращает значение указателя по заданным сегментному адресу seg и смещению ofs.