
Методические указания
К п.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. Одной из областей, где необходимо использование указателей, является работа со списками, например, односвязными и двусвязными. Списки имеют начало и конец. Основные действия: создание, просмотр, вставка и удаление элемента в указанном месте списка.
Широкое распространение среди односвязных списков получили такие динамические структуры данных, как стеки, очереди и кольцеобразные списки. Стек организован таким образом, что программе доступна лишь его вершина: оттуда можно взять элемент или записать его туда. Таким образом, элементы можно извлечь из стека в порядке, обратном порядку их записи -"последний вошел - первый вышел". Очередь же реализует другой вариант доступа к данным - "первый вошел - первый вышел’. Новый элемент добавляется в конец очереди, а выбирается первый. Если последний элемент очереди связать с первым элементом, то получится замкнутый, кольцеобразный список..
Для работы с такими структурами при выполнении индивидуального задания рекомендуется использовать базовые процедуры:
создать список;
очистить список;
поместить элемент в список;
взять (удалить) элемент из списка;
просмотреть элементы списка.