Программирование на языке Delphi/§9
Указатель - это переменная, которая в качестве своего значение содержит адрес первого байта данных. С помощью указателей можно размещать в динамической памяти любой тип данных. Указатели бывают типизированными и нетипизированными.
Типизированные указатели - указатели, которые связаны с типом данных(integer, real и т.п.). Для объявления типизированных указателей используется символ ^. Например:
...
var p1:^integer;
p2:^double;
type
UMyRecord = ^PRecord;
PRecord = record
field1,field2:integer;
field3:UMyRecord;
end;
Типизированые указатели можно использовать как типы данных, на которые они ссылаются. Для этого после идентификатора переменной надо указывать символ ^. Для любой динамической переменной необходимо выделить память. Её можно выделить с помощью процедуры New. Но при выделение памяти необходимо после работы освобождать память (иначе вся память компьютера может закончиться). Освободить память можно с помощью процедуры dispose. Получить адрес любой переменной можно с помощью функции addr или с помощью символа @. Например:
...
var a:^integer;
b:integer;
begin
b:=100;
new(a); //Выделяем динамическую память
a^:=b; //Так можно, значение a теперь равно значению b.
dispose(a); //Освобождаем память
a:=@b; //Так тоже можно, но теперь указатель a ссылается на переменную b (т.е., значение a это адрес b)
a:=b; //Так нельзя, a и b - разные типы.
...
end.
В отличие от типизированных указателей, нетипизированные указатели обозначаются типом pointer. Нетипизированные указатели следует использовать если заранее неизвестно с каким типом данных надо работать.
Некоторые функции и процедуры для работы с указателями
правитьФункция | Описание |
---|---|
function Addr(x):pointer; | Возвращает адрес аргумента x. Вместо этой функции можно использовать символ @. |
procedure New(var x:pointer); | Выделяет память и возвращает ее адрес в аргумент |
procedure Dispose(var x:pointer); | Освобождает память, которая была зарезервирована за указателем х. |
procedure GetMem(var p:pointer; size:integer); | Выделяет память для аргумента p с размером size. |
procedure FreeMem(vap p:pointer; size:integer); | Освобождает память, начиная с адреса p, размером size. |
function sizeof(x):integer; | Возвращает длину в байтах внутреннего представления указанного объекта х. |