Указатели
Указатель - это ячейка памяти, хранящая адрес. В PascalABC.NET указатели делятся на типизированные (содержат адрес ячейки памяти данного типа) и бестиповые (содержат адрес оперативной памяти, не связанный с данными какого-либо определенного типа).
Тип указателя на тип T
имеет форму ^T
, например:
type pinteger = ^integer;
var p: ^record r,i: real end;
Бестиповой указатель описывается с помощью слова pointer
.
Для доступа к ячейке памяти, адрес которой хранит типизированный указатель,
используется операция разыменования ^
:
var
i: integer;
pi: ^integer;
...
pi := @i; // указателю присвоили адрес переменной i
pi^ := 5; // переменной i присвоили 5
Операция разыменования не может быть применена к бестиповому указателю.
Типизированный указатель может быть неявно преобразован к бестиповому:
var
p: pointer;
pr: ^real;
...
p := pr;
Обратное преобразование также может быть выполнено неявно:
pr := p;
pr^ := 3.14;
Указатели можно сравнивать на равенство (=
) и неравенство (<>
). Для того чтобы отметить тот факт, что указатель никуда не указывает,
используется стандартная константа nil
(нулевой указатель) :
p := nil
.
Внимание! Ввиду особенностей платформы
.NET тип T
типизированного указателя не должен быть ссылочным или содержать ссылочные типы
на каком-то уровне (например, запрещены указатели на записи, у которых одно из
полей имеет ссылочный тип). Причина
такого ограничения проста: указатели реализуются неуправляемым кодом, который не
управляется сборщиком мусора. Если в памяти, на которую указывает указатель,
содержатся ссылки на управляемые переменные, то они становятся недействительными
после очередной сборки мусора. Исключение составляют динамические массивы и
строки, обрабатываемые особым образом. То есть, можно делать указатели на
записи, содержащие в качестве полей строки и динамические массивы.