
4.12.3. Нетипизированные указатели.
Эти указатели не связанные с каким либо конкретным типом данных. Они объявляются с помощью стандартного типа Pointer, например так
PA, PS : Pointer;
С помощью нетипизированных указателей удобно динамически размещать данные , структура и тип которых меняются в ходе выполнения программы.
Память для значения данного соответствующего У1^ и для указателя отводится в процессе выполнения программы, причем программист может по своему усмотрению указать, когда надо выделить память для тех или иных динамических переменных и когда можно освободить эту динамическую память. Для этих целей есть две стандартные процедуры.
Процедура NEW (указатель) - выделяет динамическую память, то есть присваивает указателю адрес ячейки памяти, в которую можно помещать данные.
Процедура DISPOSE (указатель) - возвращает динамическую память в кучу. При выполнении этой процедуры только освобождается динамическая память, а сам указатель не изменяется. Для исключения возможных ошибок целесообразно после применения процедуры DISPOSE присвоить указателю нулевое значение, которое в ТР задается константой NIL.
Пример использования указателей.
Program ykaz;
Var
Za , Zb : ^ real;
k,f,g : Real;
Begin {главная программа}
New (Za) ; New (zb) ;
Za ^ : = 10.5 ; Zb ^ : = 15.2 ;
f : = Zb ^ + Za ^ ; { f = 25.7 }
Zb : =Za;
k : = Zb ^ + Za ^ ; { k = 21 !! }
. . . . . . . . . .
4.12.4. Объявление указателей.
Как объявить указатели простых типов было показано выше. Для сложных типов указатели можно объявлять по разному. Обычно используют известный способ - в разделе типов объявляют идентификатор типа, который используют в разделе переменных.
Пример. Type Sm = Array[1..100] Of Integer;
Var Myk : ^ Sm ;
(можно и так Var PT : Array [1..20] Of ^Real; ).
4.12.5. Операции с указателями.
К динамическим переменным можно применять все операции, которые определены для обычных переменных соответствующих типов.
К самим указателям можно применять:
операцию присваивания. В этом случае указатель получает значение адреса. Правило: указатели связанные операцией присваивания должны быть одного типа.
операции сравнения = и <> .
Замечание - обращение к элементам массива Ms[k,n]^ , то есть символ ^ записывается после квадратных скобок.
Создание массива указателей For j : = 1 To N Do
New( Mp[j] );.
Параметром процедуры New() может быть только типизированный указатель. Для работы с нетипизированными указателями предназначены процедуры:
GetMem(Z, Size) – для резервирования памяти;
FreeMem(Z, Size) - для освобождения памяти.
Здесь Z – нетипизированный указатель; Size – размер (в байтах) резервируемой или освобождаемой динамической памяти.