Процедуры и функции для работы с указателями и адресами в Паскале

Операции с указателями

Ссылочные типы. Указатели в Паскале

Указатель – это переменная, которая содержит адрес другой переменной (байта памяти).
В ТР имеется два вида указателей: указатель на объект некоторого типа (типизированный) и указатель, не связанный с типом.
Описание указателей.

Для объявления типизированных указателей используется значок ^, который помещается перед соответствующим типом:

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

(тело алгоритма А)