
- •Динамические структуры данных
- •В ЯП высокого уровня обычно есть возможность выделять и освобождать память для размещения
- •Тип-указатель
- ••Адрес – совокупность двух 16-ти разрядных слов - сегмента и смещения.
- •Организация памяти во время выполнения программы
- •Организация памяти во время выполнения программы
- •Объявление типа
- •Операции, изменяющие значения
- •Операции над указателями
- •Стандартные процедуры для работы с динамической памятью
- •procedure Dispose(P);
- •procedure GetMem(P, Size);
- •Указатели и динамические структуры данных
- •Динамический массив не имеет фиксированного размера.
- •Текущее максимальное значение индекса определяется с помощью функции
- •Связанные динамические структуры данных (ДСД)
- •Связанный список
- •Предпосылки к объявлению типа список
- •Объявление типа список:
- •Операции со списками
- •Частный случай списка:
- •program Stack;
- •function Pop(var head: PStackItem): integer;
- •function IsEmpty(head:PStackItem):boolean; { Проверяет стек на пустоту }
- •Частный случай списка:очередь - список с двумя точками доступа
- •Процедурный тип
- •Общая структура подпрограммы:
- •Локализация (доступность) объявленных
- •Реализация определения и вызова
- •Подпрограмме соответствуют 2 части: статическая
- •Динамическая часть называется записью активации.
- •во время выполнения программы для каждой подпрограммы в памяти хранится только сегмент кода,
- •Управление подпрограммами
- •Используется явное обращение к подпрограмме с помощью оператора вызова.
- •Подпрограмма выполняется полностью при каждом вызове.
- •Применительно к подпрограммам следует
- •из ячейки памяти, адрес которой хранится в счетчике команд, выбирается очередная команда;
- •Указатель на текущую команду
- •Эта команда называется
- •Действия интерпретатора :
- •Указатель текущей среды
- •Если в некоторой команде подпрограммы используется некоторая переменная х, то определить,
- •Создание записи активации для главной программы (существует в единственном экземпляре
- •Переменной CIP присваивается указатель на первую команду в сегменте кода главной программы.
- •Если команда является вызовом подпрограммы, то
- •Для корректного возвращения из вызванной на некотором этапе подпрограммы В в вызывавшую подпрограмму
- •То есть, восстановление старых значений
- •RP предоставляет память для хранения пары указателей (ip, ep) –указатель команды и указатель
- •При возврате из подпрограммы (например, командой return) извлекаются старые значения (ip, ep) из
- •Подпрограммы-функции
- •Заголовок функции
- •Значения, возвращаемые из
- •Подпрограммы-процедуры
- •Заголовок процедуры:
- •Вызов подпрограммы
- •Параметры-значения
- •Параметры-константы
- •Параметры без типа
- •Рекурсивные подпрограммы
- •Процедурный тип
- •Объявление процедурного типа
- •Пример: нахождение таблиц умножения и
- •procedure printtable(operation: fun); var i, j: byte;

Динамические структуры данных
Общее свойство рассмотренных типов данных (простых, структурированных) :
под них выделяется оперативная память и устанавливаются внутренние связи на этапе компиляции и компоновки, которые не меняются во время работы программы.
Это - статические данные и структуры данных.
Доступ к статическим переменным осуществляется через их имена.
1

В ЯП высокого уровня обычно есть возможность выделять и освобождать память для размещения данных
во время работы программы.
Таким образом можно сконструировать
динамические структуры данных.
Область оперативной памяти для размещения динамических данных называется
динамической памятью, или кучей
(англ. Heap - куча, множество, накопление).
Доступ к динамическим переменным осуществляется через указатели на место их расположения в памяти.
2

Тип-указатель
Указатель дает адрес элемента
определенного, базового типа
Указатель указывает на элемент
базового типа.
Стандартный тип-указатель Pointer
является бестиповым и совместим с любым указателем.
Значение указателя занимает 4 байта
3

•Адрес – совокупность двух 16-ти разрядных слов - сегмента и смещения.
•Сегмент - участок памяти, имеющий максимальную длину 64К.
•Сегменты адресуют память с точностью до параграфа (фрагмент памяти =16 байт).
•Смещение – линейная адресация в сегменте
•Смещение адресует память с точностью до байта.
•Глобальные переменные и типизированные константы размещаются в сегменте данных.
•Такие переменные называются статическими.
•Память, выделяемая компилятором для их хранения, называется статической памятью.
4

Организация памяти во время выполнения программы
Куча используется для размещения объектов, созданных при помощи операции new.
5

Организация памяти во время выполнения программы
Куча используется для размещения динамических переменных.
6

Объявление типа
type Pбазовый_тип =^базовый_тип;
var p1:Pбазовый_тип; p2: Pointer;
Пример:
type PByte =^Byte; var px:PByte;
{в рx может храниться адрес области памяти
}
7

Операции, изменяющие значения
указателей
Операция взятия адреса с последующим присваиванием:
указатель:=@переменная базового типа;
Операция присваивания
для однотипных указателей.
Операция присваивания константы NIL любым указателям.
NIL - пусто, ничто
переменная ни на что не указывает.
8

Операции над указателями
Операции сравнения
= <> для однотипных указателей.
Операция разыменования –
взятие элемента по указателю:
значение элемента, с которым связан
указатель:
указатель^
9

Стандартные процедуры для работы с динамической памятью
procedure New(P);
Процедура выделяет область памяти, соответствующую базовому типу указателя P.
Переменная P принимает значение указателя на эту область.
Можно использовать и как функцию:
New(px);
или
px := New(PByte);
10