Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
динамические структуры.doc
Скачиваний:
4
Добавлен:
14.09.2019
Размер:
154.11 Кб
Скачать

Динамическая память и динамические структуры данных

До сих пор мы рассматривали переменные, которые описывались в разделе var какого-либо блока программы или подпрограммы. Транслятор после анализа этого раздела и до выполнения программы отводит каждой переменной соответствующее число ячеек в памяти. Так, например, переменным типа integer отводится 2 байта, переменным real – 6 байтов и т.д. Эти ячейки закрепляются за данной переменной на все время работы программы в оперативной памяти. Такие переменные называются статическими.

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

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

Статические переменные размещаются в непрерывной области оперативной памяти длиной 64 килобайта. Однако часто этого оказывается мало для обработки массивов и других структурированных данных большой размерности. С другой стороны объем оперативной памяти намного превышает значение 64 Kбайта, поэтому большая часть оперативной памяти остается не использованной, в связи с этим вводится понятие «динамической памяти» или «кучи».

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

Начальный адрес «кучи» хранит стандартная переменная Heaporg. Конечный адрес «кучи» хранит Heapend.

Текущая граница незанятой части «кучи» определяется значением стандартной переменной Heapptr.

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

Переменные – указатели

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

Указатель – это переменная, значением которой является адрес другой переменной или структуры данных в динамической памяти.

Переменная- Обычная переменная

указатель

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

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

  1. Type < имя типа >=^< тип данного >;

Var < имя переменной-указателя>: < имя типа>;

  1. Var < имя переменной-указателя>:^< тип данного>;

Пример:

  1. Type ukazatel = ^ integer; Var A,B : ukazatel;

  1. Var A, B: ^ integer; C: ^ real;

Здесь значением переменных А и В может быть адрес динамической памяти, начиная с которого будет выделено 2 байта для переменных типа integer. А значением переменной С будет адрес динамической памяти, начиная с которого будет выделено 6 байт для переменной типа real.

В описании <тип данного> может быть любым, кроме файлового.

Для описания переменной типа указатель в Оbject Рascal предусмотрен также специальный стандартный тип, который называется pointer (указатель). Он не связан ни с одним конкретным типом данных и совместим с любым типом указателя.

Существует 4 способа присваивания значений переменным типа указатель: