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

Методические указания

К п.1.

Оставшаяся свободной область памяти частично или полностью может быть занята динамической памятью. В ней размещаются динамические переменные. Эта часть памяти называется heap (“куча”)

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

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

Указатель связывается не с конкретной переменной, а с определенным типом данных. Для описания указателя используется знак ^”.

Пример описания

Type

IP = ^Integer; {тип указателя на целое}

P = ^Zap; {тип указателя на запись Zap}

Zap = record

...

end;

Var

Pointer1 : ^Char; {указатель на Char}

Pointer2 : ^Real; {указатель на Real}

В Паскале определена лишь одна операция над указателями - присваивание. Можно присвоить значение одного указателя другому указателю на тот же тип данных. Существуют также нетипизированные указатели, которые совместимы с указателями на любой тип. Для объявления переменной нетипизированным указателем нужно употреблять ключевое слово Pointer

Var

TypePointer: Pointer;

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

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

type

PE = ^integer;

begin

...

New(PE);

...

end.

В приведенном примере в куче выделяется 4 байтf (в соответствии с размером типа integer) и адрес начала этой области возвращается в указателе PE. Для обращения к полученной динамической переменной используется конструкция вида <имя указателя>^:

PE^:=3.1415;

PE^:=sqr(PE^);

Для освобождения динамической памяти используется процедура Dispose -

Dispose(pe); {освобождает 4 байта в куче}

К п.2. Одной из областей, где необходимо использование указателей, является работа со списками, например, односвязными и двусвязными. Списки имеют начало и конец. Основные действия: создание, просмотр, вставка и удаление элемента в указанном месте списка.

Широкое распространение среди односвязных списков получили такие динамические структуры данных, как стеки, очереди и кольцеобразные списки. Стек организован таким образом, что программе доступна лишь его вершина: оттуда можно взять элемент или записать его туда. Таким образом, элементы можно извлечь из стека в порядке, обратном порядку их записи -"последний вошел - первый вышел". Очередь же реализует другой вариант доступа к данным - "первый вошел - первый вышел’. Новый элемент добавляется в конец очереди, а выбирается первый. Если последний элемент очереди связать с первым элементом, то получится замкнутый, кольцеобразный список..

Для работы с такими структурами при выполнении индивидуального задания рекомендуется использовать базовые процедуры:

создать список;

очистить список;

поместить элемент в список;

взять (удалить) элемент из списка;

просмотреть элементы списка.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]