Delphi. Pascal
Урок 21. Указатели
Описание указателя | Пример |
имя-указателя: ^имя-типа; | var pdata: ^data; |
Ссылка с помощью указателя | Пример |
имя-указателя^ | pdata^ := 0; |
Процедура | Операция | Пример |
new(имя-указателя) | Выделить память для переменной (создать переменную для указателя) | new(pdata); |
dispose(имя-указателя) | Освободить память переменной (указатель:=nil) | dispose(pdata); |
Указатель представляет из себя переменную, содержащую адрес другой переменной. Точнее говоря, указатель содержит адрес начала другой переменной (которая, в принципе, может занимать достаточно большой объем памяти).
Указатели бывают типизированные и нетипизированные. Типизированные указатели содержат адрес переменной определенного типа. Так, например, типизированный указатель целого типа естественно содержит адрес переменной типа Integer.
Для объявления типизированного указателя мы должны перед названием типа добавить знак ^. Если вы программировали на C/C++, то этот знак - это аналог звездочки. В такой указатель можно записать адрес некоторой другой переменной, для чего перед именем этой другой перемнной надо поставить значок взятия адреса @.
По указателю мы можем получить как адрес другой переменной (указатель именно его и содержит) и значение переменной, на которую указатель показывает. Для получения значения переменной, на которую показывает указатель, мы используем разыменование указателя. Обратите внимание, что, в отличие от C/C++ для разименования указателя мы ставим значок ^ после имени указателя (а не перед, как в C/C++).
Вот пример использования указателя:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
n: Integer; // Объявляем целое.
p: ^Integer; // Объявляем указатель на целое.
begin
{ TODO -oUser -cConsole Main : Insert code here }
// Инициализируем n.
n:= 22;
// Записываем в указатель p адрес переменной n.
p:=@n;
// Выводим разыменованный указатель (т. е. n).
Writeln('^p=', p^);
// Записываем в разыменованный указатель (т. е. n) 120.
p^ := 120;
// Выводим на экран n.
Writeln('n=', n);
Readln; //Ожидаем, пока пользователь нажмет Enter
end.
Результат будет таким: