Процедуры и функции для работы с указателями и адресами в Паскале
Операции с указателями
Ссылочные типы. Указатели в Паскале
Указатель – это переменная, которая содержит адрес другой переменной (байта памяти).
В ТР имеется два вида указателей: указатель на объект некоторого типа (типизированный) и указатель, не связанный с типом.
Описание указателей.
Для объявления типизированных указателей используется значок ^, который помещается перед соответствующим типом:
Type T = ^T1;
Var A :T;
где: T – имя типа;
T 1 - базовый тип (любой в т.ч. указатель);
^ - указатель.
Примеры:
Var
a :byte; {выделение памяти для переменной где хранится ее значение}
a ;^byte; {выделение памяти для переменной где хранится ее адрес}
Var
p1 :^integer;
p2, p3 :^real;
Для объявления переменных не связывая их, с каким либо типом данных можно использовать указатель без типа (pointer).
Var
p :pointer;
где: pointer - не типизированный указатель, который занимает в памяти 4 байт (2-байта сегмент, 2байта смещение.).
Для указателей допустимы операции сравнения и присваивания.
Присваивание. Указателю можно присвоить содержимое другого указателя того же самого типа или константу NIL – пустой, или адрес объекта с помощью функции ADDR или оператора @.
Пример:
P1 := PP;
P2 := NIL;
P3 := Addr(X);
P4 := @X;
Функции:
ADDR(X) – результат POINTER, в котором содержится адрес аргумента. (X –имя любой переменной, процедуры или функции).
OFS(X):WORD – возвращает значение смещения адреса объекта X.
SEG(X):WORD – возвращает значение сегмента адреса объекта X.
CSEG(X):WORD – возвращает текущее значение регистра Cs.
DSEG(X):WORD – возвращает текущее значение регистра Ds.
SSEG(X):WORD – возвращает текущее значение регистра Ss.
SPRT(X):WORD - возвращает текущее значение регистра Sp.
PRT(SEG,OFS) – преобразует отдельно заданные значение сегмента и смещения к типу указателя.
MAXAVAIL:LONGINT - возвращает размер наибольшего непрерывного участка кучи.
MEMXAVAIL:LONGINT - возвращает размер общего свободного пространства кучи.
Процедуры:
DISPOSE(TP:POINTER) – уничтожает динамическую переменную и возвращает в кучу фрагмент динамической памяти, который был зарезервирован
указателем.
NEW(TP:POINTER) – резервирует фрагмент кучи для размещения переменной.
GETMEM(P:POINTER; ZIZE:WORD) –выделяет из кучи блок заданного размера и адрес его начала присваивает указателю.
FREEMEM(P:POINTER; ZIZE:WORD) – освобождает блок заданного размера..
MARK(P:POINTER) – запоминает текущую вершину кучи (адрес начала свободного участка).
RELEASE(P:POINTER) – освобождает участок кучи от адреса с P до конца.
Пример 19.1. Сгенерировать случайным образом массив случайных чисел. Разместить массив в динамической памяти, найти сумму элементов и удалить его с памяти.
Текст программы
, которая необходима для решения задачи и реальной цели (выходной информации, результата задачи), которая должна быть достигнута
Ввод чисел исходной информации
(аргумента задачи Е)
Вывод выходной информации
(результата задачи R),
Операторы, выполняемые
алгоритмом решения
задачи А(Е) = R
(тело алгоритма А)
Ввод исходных чисел Е = a,b,c
Вывод результата задачи R =S
Операторы алгоритма R = А(Е),
S = (a+b+c)/3
_ R
(тело алгоритма А)