Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Паскаль / spravochnictp7 / Справочник по Турбо Паскалю 7.0.rtf
Скачиваний:
94
Добавлен:
10.12.2013
Размер:
821.03 Кб
Скачать

2.5.4. О переменных-указателях и динамической памяти

В ТП 7.0 существует возможность работы с динамическими структурами данных. Это позволяет эффективно использовать память компьютера.

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

Переменная-указатель – переменная целого типа – это адрес байта памяти, содержащей другое данное (переменную, константу, адрес другой переменной и т.п.). Любой ссылочный (адресный) тип данных определяет множество значений, которые являются указателями (ссылками) на значения какого-либо другого типа данных. Указатели и динамические переменные позволяют создавать сложные динамические структуры данных, такие как связанные списки и деревья. [5, 7]

Описание переменной-указателя

1) ИмяУказателя : ^ Тип – типизированный указатель;

2) ИмяУказателя : Pointer – нетипизированный указатель;

Здесь Тип – тип переменной, на которую ссылается переменная-указатель с именем ИмяУказателя; Pointer – любой стандартный тип ссылочных (адресных) данных.

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

Для указателей в ТП 7.0 допустимы только операции сравнения и присваивания. Указателю можно присваивать значение указателя того же типа, константу NIL (пустой указатель) или адрес объекта, определенный с помощью стандартных функций модуля System - Addr (ИмяПеременной) (оператора @ИмяПереиенной) и Ptr(СегментнаяЧастьАдреса, Смещение).

Объем динамической памяти, а также целого блока динамически распределяемой памяти – кучи, называемой Heap-областью, - регулируется с поиощью директивы компилятора {$M}, причем минимальный размер ее равен нулю, а максимальный – объему всей свободной памяти DOS. Использование в программе для обозначения адреса переменной типизированного адресного оператора @ возможно лишь при установленном режиме {$T+} директивы-переключателя {$T} или при активизации пункта меню Options/Compiler/Typed @ operator.

  • Для выделения памяти новой динамической переменной используется процедура New(ИмяУказателя). После завершения работы с динамической переменной следует освободить динамическую память, применив к ней процедуру Dispose(ИмяУказателя) и присвоить затем этой переменной значение NIL. Таким образом, перед каждым повторным вызовом оператора New должен стоять вызов оператора Dispose. В начале работы программы значения указателей равны NIL (они ни на что не ссылаются).

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

Для динамического распределения памяти, помимо процедур New и Dispose, в TP 7.0 служат процедуры GetMem и FreeMem. Для динамического распределения целого блока динамически распределяемой памяти - кучи, в TP 7.0 служат процедуры Mark и Release. Подробнее см. [6, 7].

30