
- •Динамические структуры данных Классификация структур данных
- •Понятие о динамической памяти
- •Адреса и указатели
- •Описание и состояния указателей
- •Работа с указателями в программе
- •Объявление указателя
- •Выделение памяти
- •Работа с информацией (разыменование)
- •Работа с адресом
- •Освобождение памяти
- •Особенности динамических данных
- •Связанные динамические структуры
- •Организация взаимосвязей в связанных динамических данных
- •Основные типы связанных динамических структур
- •Работа с очередью
- •Работа со стеком
- •Создание стека
- •Добавление элемента
- •Удаление элемента стека
Описание и состояния указателей
Работа с указателем начинается с его объявления. Объявлять можно указатели 2-х типов.
Первый тип - стандартный. Для его описания используется слово pointer. Такой указатель может содержать адрес переменной любого типа.
Пример описания: P: pointer;
Второй тип - пользовательский. Для его описания используется символ ^. После этого символа нужно указать тип объекта, адрес которого будет содержать указатель.
Пример описания пользовательских указателей:
Var k,i:^integer; //указатели на целые перемен.
F: ^real; //указатель на веществ. перемен.
Ch:^char; // указатель на символьную переменную
Указатель может находиться в одном из трех состояний:
Содержит адрес какой-либо переменной, память под которую уже выделена. Говорят, что указатель ссылается на эту область. Эту ссылку на рисунке обозначают стрелкой:
P
P^
а
дрес
Содержит специальный пустой адрес Nil:
-
P
N
il
Находится в неопределенном состоянии, на рисунке это стрелка с вопросом:
-
P
?
?
Работа с указателями в программе
Операции с указателями: присваивание, разыменование (раскрытие ссылки), получение адреса указателя, операции сравнения.
Объявление указателя
Var
a,b:^integer; {объявление указателей}
После объявления указатели находятся в неопределенном состоянии:
|
? |
b |
? |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Выделение памяти
Процедура New(указатель). Она выделяет область памяти, размер которой определяется типом, заданным в объявлении указателя. Адрес этой области записывается в переменную-указатель, указанную в скобках. Для пример выше:
new(a);
new(b);
При этом в памяти сначала выделяется область для хранения значения целого типа (т.к. в функции new параметр a – это указатель на целое число). Адрес этой области помещается в переменную-указатель а. В дальнейшем для обращения к содержимому этой области будет использоваться значение адреса, хранящееся в указателе а. Это обращение будет выглядеть как «a^». На рисунке обозначим так:
a |
адрес 1 |
b |
? |
a^ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Затем происходит выделение памяти под размещение еще одной целочисленной переменной. Ее адрес будет помещен в b. Обозначим по аналогии:
a |
адрес 1 |
b |
адрес 2 |
a^ |
|
b^ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|