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

19. Понятие кучи. Основные процедуры и функции для работы с динамической памятью.

Куча — это специализированная структура данных типа дерево, которая удовлетворяет свойству кучи: если B является узлом-потомком узла A, то ключ(A) ≥ ключ(B). Из этого следует, что элемент с наибольшим ключом всегда является корневым узлом кучи, поэтому иногда такие кучи называют max-кучами (в качестве альтернативы, если сравнение перевернуть, то наименьший элемент будет всегда корневым узлом, такие кучи называют min-кучами). Не существует никаких ограничений относительно того, сколько узлов-потомков имеет каждый узел кучи, хотя на практике их число обычно не более двух.

Для работы с динамической памятью используют указатели - особые переменные хранящие адреса областей памяти.

Указатели делятся на стандартные и определяемые программистом. Величины стандартного типаpointerпредназначены для хранения адресов данных произвольного типа:

var p : pointer;

Программист может определить указатель на данные или подпрограмму конкретного типа. Как и для других нестандартных типов, это делается в разделе type:

type pword = ^word; { читается как "указатель на word" } ... var pw : pword;

Такие указатели называются типизированными. Можно описать указатель на любой тип данных, кроме файловых. Тип указателя на данные можно описать и непосредственно при описании переменной:

var pw : ^word;

Для указателей определены только операции проверки на равенство и неравенство и присваивания. Правила присваивания указателей:

  • Любому указателю можно присвоить стандартную константу nil, которая означает, что указатель не ссылается на какую-либо конкретную ячейку памяти.

  • Указатели стандартного типа pointer совместимы с указателями любого типа.

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

20. Динамические структуры данных. Указатели.

Динамические структуры данных создаются (т.е. размещаются в оперативной памяти) во время исполнения программы. Статические данные размещаются при загрузке программы и занятая ими память не может быть освобождена или использована для других целей во время исполнения программы

Схема динамического размещения данных:

Должна быть описана переменная - УКАЗАТЕЛЬ на создаваемую структуру данных. Указатель - это специальный тип данных, хранящий адрес начала участка памяти, выделяемой данной структуре.

При помощи процедуры New или GetMem с этой переменной связывается (выделяется) необходимый объем памяти из зоны памяти, называемой кучей (heap), причем переменной присваивается адрес начала выделенной памяти. Выделение означает, что система запрещает доступ к этой памяти посторонним. Выделеная память не инициализируется (не заполняется) ничем, т е в ней находится мусор.

Программа может использовать выделенную память. Например, если pt2 - указатель, то pt2^ используется для обращения к данным: pt2^ := 23.56; xx := sin(pt2^*pi/180); и т д. Существуют и другие способы обращения к данным, находящимся в этой области, например, использование процедур.

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

Типы указателей, описание указателей

Типизированные указатели. Описание типа имеет вид:

type <имя типа> = ^<базовый тип>;

где базовый тип - любой известный тип данных (т е в том числе - описанный ранее), кроме файлового. Пример: type pod = ^double; arab = array [1..100] of integer; par = ^arab;

Описание переменной имеет вид:

var <имя переменной> : <имя типа - указателя> или ^<базовый тип>; Пример:

var p1: pod; xs: par; xs2: ^arab;

Нетипизированные указатели (pointer). Если используется этот тип указателя, програмист должен заботиться о преобразовании данных к правильному типу например, перед выводом на экран. Описание типа не нужно (есть pointer):

Описание переменной имеет вид:

var ps1,kot,wes: pointer;