
- •Адресные типы
- •Использование динамической памяти
- •Линейные списки
- •Формы представления линейных списков в оперативной памяти
- •Стеки, очереди, деки
- •Представление стека в непрерывной памяти (в виде массива)
- •Представление стека в связанной памяти (в виде односвязного списка)
- •Очереди
- •Представление очереди в непрерывной памяти (в виде массива)
- •Представление очереди в связанной памяти (в виде односвязного списка)
- •Односвязный список
- •Двусвязный список
- •Кольцевые списки
- •Сортировка с помощью прямого выбора
- •Сортировка с помощью прямого обмена (пузырьковая)
- •Оценка затрат на поиск элемента
Адресные типы
Оперативную память компьютера можно представить в виде набора ячеек, каждая из которых имеет свой собственный адрес. Для задания этого адреса используются 4-х байтовые переменные следующих типов:
Указатели (тип Pointer)
Нетипизированный указатель. Переменная задает адрес конкретной ячейки оперативной памяти.
Ссылки (<имя_типа>=^<базовый_тип>)
Типизированный указатель. Переменная задает адрес значения базового типа.
-
ОПИСАНИЕ ССЫЛКИ:
TYPE
pT=^T;
Var
p:pT;
T - имя базового типа
pT – имя ссылочного типа, задающего адрес значения типа Т
p - переменная-ссылка
Ссылка
Расположена в сегменте данных или стеке
Динамическая переменная
Может быть размещена в любой области памяти (обычно - в куче)
Рис. 1. Ссылка на значение
ПРИМЕР 1. ОПИСАНИЕ ССЫЛОЧНЫХ ТИПОВ.
TYPE
ARR=ARRAY[1..5] of Integer;{базовый тип - массив}
COMPL=RECORD {базовый тип - запись}
X,Y:REAL
END;
pCompl=^Compl; {описание типа «ссылка на запись»}
Var
PInt: ^Integer; {ссылка на целое, 4 байта; рис. 2a}
pc: pCompl; {ссылка на запись, 4 байта; рис. 2b}
pa:^ARR; {ссылка на массив целых, 4 байта; рис. 2c}
ap: Array[1..5] of ^Integer; {массив ссылок на целые, 20 байтов; рис. 2d}
Рис. 2. Примеры ссылок (a - ссылка на целое, b - ссылка на запись, c - ссылка на массив, d - массив ссылок)
При определении ссылки недопустимо конструировать базовый тип, вместо этого следует использовать его идентификатор:
TYPE
ARR=ARRAY[1..5] of Integer;
Var
pa:^ARR; //корректное описание ссылки
pb:^ARRAY[1..5]
of
Integer;
//некорректное
описание ссылки
Таким образом, разделяются понятия ссылок и данных, на которые они указывают.
С помощью ссылочных типов можно обратиться к ячейкам, расположенным вне сегмента данных, и работать с хранящимися в них значениями.
Константа NIL задает пустую ссылку (ссылку, которая ни на что не указывает).
ДОПУСТИМЫЕ ОПЕРАЦИИ НАД ЗНАЧЕНИЯМИ АДРЕСНЫХ ТИПОВ
Сравнение (= , <>)
Ограничение для ссылок: ссылки должны указывать на значения одного типа.
Присваивание
Ограничение для ссылок: ссылки должны указывать на значения одного типа.
Разыменование (^)
Используется для перехода от ссылочной переменной к значению, на которое она указывает.
Неприменима к значениям типа Pointer (неизвестен тип значения, хранящегося по заданному адресу).
Тип Pointer совместим по присваиванию со всеми ссылочными типами.
ФУНКЦИИ ДЛЯ РАБОТЫ С АДРЕСНЫМИ ТИПАМИ
ТАБЛИЦА 1. Функции для работы с адресами памяти в Delphi*.
-
Addr(var x):Pointer
операция @x:Pointer
Ссылка на начало объекта X в памяти
Ptr(Address:Integer):Pointer
Ссылка на ячейку памяти, заданную параметром Address.
SizeOf(var x):Integer
Размер объекта X в байтах
*Особенности использования подпрограмм в других версиях языка Pascal см. в соответствующих справочных системах.