Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование / WORD / Лекции по ЯП (часть 2).doc
Скачиваний:
95
Добавлен:
15.04.2015
Размер:
2.24 Mб
Скачать

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

  • procedure GetMem(var p: Pointer; Size: Word);

Выделяет в куче непрерывный участок (блок) памяти размером Size байт, адрес начального байта этого блока присваивается указателю р; максимальное значение Size ограничено и составляет 65528.

  • procedure FreeMem(var p: Pointer; Size: Word);

Освобождает блок памяти размером Size байт, адрес которого хранится в указателе p; значение указателя р, согласно спецификации языка, становится неопределенным; фактически значение р не изменяется.

  • procedure New(var p: Pointer);

Создает динамическую переменную того типа, на которую ссылается указатель р, адрес начального байта этой переменной присваивается указателю р; заметим, что обращение к данной процедуре эквивалентно обращению

GetMem(p, SizeOf(p^)); напомним, что функция SizeOf(X) возвращает размер переменной X в байтах.

  • procedure Dispose(var p: Pointer);

Освобождает блок памяти, занимаемый динамической переменной, адрес которой хранится в указателе р; значение указателя p, согласно спецификации языка, становится неопределенным; фактически значение р не изменяется; заметим, что обращение к данной процедуре эквивалентно обращению

FreeMem(p, SizeOf(p^)).

  • procedure Mark(var p: Pointer);

Запоминает в указателе р текущее значение встроенного указателя HeapPtr, хранящего адрес вершины кучи (адрес начала физически последнего свободного блока в куче.

  • procedure Release(var p: Pointer);

Освобождает память, занятую блоками (динамическими переменными), адреса которых превышают значение указателя р; при этом текущее значение встроенного указателя HeapPtr становится равным р; значение указателя р должно быть ранее присвоено процедурой Mark.

Заметим, что процедуры GetMem и FreeMem, New и Dispose, Mark и Release являются парными. Освобождение памяти следует осуществлять либо с помощью процедур Mark и Release, либо с помощью процедур FreeMem и Dispose, смешивать указанные механизмы не следует, так как это может привести к непредсказуемым результатам.

Присваивание значений указателям

Присвоить значение указателю р можно двумя способами:

  1. с помощью оператора присваивания р:=е

где е – выражение, значение которого представляет собой адрес, то есть выражение типа указатель;

  1. путем обращения к процедуре, используя р в качестве фактического параметра-переменной.

При этом следует иметь в виду, что нетипизированный указатель может принимать значение любого другого указателя (и нетипизированного и любого типизированного), а типизированный указатель может принимать значения от нетипизированного указателя и от указателя того же базового типа.

В Паскале определен идентификатор NIL константы, называемой пустым адресом, или адресным нулем. Константа NIL не адресует никакой объект. По присваиванию она совместима со всеми указателями: как нетипизированными, так и типизированными.

Организация ссылок

Ссылка – это способ доступа к объекту программы и соответствующая синтаксическая конструкция.

В Турбо Паскале реализованы три формы ссылок на переменные:

  1. имя переменной;

  2. приведение типа;

  3. вызов функции, возвращаемый тип которой является типизированным указателем, с обязательным последующим квалификатором разыменования.

Каждая из этих форм может иметь последующие квалификаторы в виде индекса, обозначения поля записи или символа разыменования ^ (каре).

Разыменование имеет следующую синтаксическую форму: p^,

где p – типизированный (!) указатель.

Заметим, что только типизированные указатели могут использоваться для организации ссылки, нетипизированные указатели разыменовывать нельзя.

Конструкция р^ представляет собой ссылку на переменную, адрес которой содержится в указателе р, она может использоваться точно так же, как если бы переменная была представлена идентификатором.

Например, в следующем фрагменте ссылка р^ и идентификатор x являются семантическими синонимами, они символизируют один и тот же участок памяти и могут использоваться на равных правах во всех контекстах программы,

var

x: Real;

p: ^Real;

begin

р:=@х; {Теперь р^ и х – синонимы }

р^:=7.25; {То же самое, что х:=7.25 }

end.

Соседние файлы в папке WORD