Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Praktikum_po_programmirovaniyu.doc
Скачиваний:
23
Добавлен:
09.12.2018
Размер:
2.5 Mб
Скачать

8.2. Динамические структуры данных

Переменные, описанные в разделе описания переменных var, называются статическими переменными. Во время компиляции для каждого статического объекта в соответствии с его типом выделяется определенный объем памяти, который нельзя использовать для других целей до завершения работы программы. Количество объектов при работе с такими данными является постоянным во время всего жизненного цикла программы. Вместе с тем маловероятно, чтобы при всяком выполнении программы ей действительно были нужны все объекты одновременно. Решение проблемы экономного расходования памяти состоит в том, чтобы не резервировать максимальный объем памяти для размещения данных, а, предварительно определив тип данных, создавать новый экземпляр данных всякий раз, как только в нем возникает необходимость. Переменные, которые создаются и уничтожаются в процессе выполнения программы, называются динамическими.

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

Динамическая переменная имеет, как правило, тип запись и содержит, по меньшей мере, два поля: информационное поле и поле ссылки.

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

{Тип ukaz ссылается (указывает) на переменную} {типа ctack}

type ukaz= ^ stack;

stack = record

inf: integer; {Информационное поле}

146

next: ukaz; {Поле ссылки}

end;

var r: ukaz;

Только при описании ссылочных переменных допускается использование идентификатора stack до его описания.

Пусть переменная r имеет тип ukaz. Тогда после обращения к процедуре new(r) будет создана указанная переменная, в которой предусмотрено информационное поле и поле ссылки. В информационном поле будет размещаться переменная заданного типа. В поле ссылки будет находиться адрес той переменной, за которой следует данная. Через r^ обозначается сама указанная переменная. Тогда r^.inf – соответствует информационному полю, а r^. next – полю ссылки.

Пусть имеется некоторая исходная ситуация:

Здесь r и w переменные типа ukaz. Причем изначально r содержит адрес переменной со значением 10, а w – адрес переменной со значением 30. Рассмотрим следующие действия:

1

. w: = r. В этом случае w содержит теперь адрес переменной со значением 10 и картинка приобретает следующий вид:

147

2. w^: = r^. Одна указанная переменная присваивается другой. На место указанной переменной, указывающей на значение 40, заслана переменная, указывающая на значение 15.

3. w^. inf: = r^.inf. Информационное поле переменной w становится равным информационному полю переменной r.

4. w^. next: = r^. next. Поле ссылки переменной w становится равным полю ссылки переменной r.

148