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

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

К п.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 байта в куче}

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

Пример 1 Изобразить состояние динамических переменных по каждой строчке операторов:

var p1,p2,p3:^Integer;

begin

new(p1);

p1^ := 2;

new(p2);

p2^ := 3;

P1:= P2;

P2^:=nil;

Dispose(P2);

Пример 2 Что будет выведено на экран?

Program DPointer;

var p1,p2,p3:^Integer;

begin

p1:=NIL; p2:=NIL; p3:=NIL;

New(p1); New(p2); New(p3);

p1^:=2; p2^:=4;

p3^:=p1^+Sqr(p2^);

writeln(p1^:3, p2^:3, p3^:3);

p1:=p2;

writeln(p1^:3, p2^:3, p3^:3);

end.

Пример 3. Изобразить структуры списков:

  1. Односвязный список

  2. Стек

  3. Очередь

  4. Кольцо

  5. Двухсвязный список.

Пример 4: Изобразить состояние динамических переменных по каждой строчке операторов:

type tu= ^ tells;

type tells =record

i: integer;

n:tells;

end;

els, w: tu;

begin

new(els,w);

els^.I := 1;

els^.n := nil;

w:= els;

els:= nil;

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

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

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

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

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

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

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

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