- •Динамические структуры данных Классификация структур данных
- •Понятие о динамической памяти
- •Адреса и указатели
- •Описание и состояния указателей
- •Работа с указателями в программе
- •Объявление указателя
- •Выделение памяти
- •Работа с информацией (разыменование)
- •Работа с адресом
- •Освобождение памяти
- •Особенности динамических данных
- •Связанные динамические структуры
- •Организация взаимосвязей в связанных динамических данных
- •Основные типы связанных динамических структур
- •Работа с очередью
- •Работа со стеком
- •Создание стека
- •Добавление элемента
- •Удаление элемента стека
Адреса и указатели
За стоянием динамической памяти можно следить при помощи специально предопределённых в языке Pascal переменных типа указатель (Pointer). Для того чтобы понять, что такое указатель, рассмотрим связь между именами, адресами и значениями переменных. Программист объявляет переменную, задавая ей имя и указывая ее тип. Пусть у нас имеется последовательность объявлений:
Var ch:char; {1 байт}
data :integer; {2 байта}
summa :real; {6 байт}
Begin
ch:=’G’;
date:=1937;
summa:=2.015E-6;
При запуске программы для хранения значения каждой переменной в памяти выделяется количество байт, определяемое ее типом (указано в комментариях). Пусть переменные размещаются в памяти, начиная с адреса 1А2Вh. Тогда в памяти значения переменных будут размещены так:
Адреса байт памяти |
1А2В |
1A2C |
1A2D |
1A2E |
1A2F |
1A30 |
1A31 |
1A32 |
1A33 |
1A44 |
|
‘G’ |
1937 |
2.015E-6 |
|
||||||
|
ch |
date |
summa |
|
|
|
||||
Далее по тексту программы все упоминания имени переменной будут заменены адресом 1-го байта выделенной области памяти: ch на 1А2В, date – на 1А2С, summa – на 1А2Е. Из этих областей будут выбираться значения для вычисления выражений. Так происходит работа со значением переменной.
Но программист может получить значение адреса переменной. Для этого в ЯП существует операция «взятие адреса» (другое название – «получение указателя»). В Pascal’е эта операция обозначается символом @. Это унарная операция (ей нужен только один операнд), применять ее можно к объектам программы, которые имеют имя и размещены в памяти. Это переменные, процедуры, функции.
Для дальнейшей обработки этого адреса ЯП имеют средства хранения, преобразования и передачи адреса. Это специальный тип данных, который называется указатель. Указатель – это переменная, значением которой является адрес объекта программы, размещенного в памяти и имеющего определенный тип. Сами указатели располагаются в статической памяти, имеют размер 4 байта. Значения указателей представляются в виде двух величин типа Word (сегмент : смещение). Их нельзя ввести с клавиатуры и вывести на устройства вывода. Сегмент – это участок памяти объемом 64 Кб, который начинается с физического адреса памяти, кратного 16 (т.е. 0,16,32,64,…). Смещение указывает, сколько байт нужно пропустить от начала сегмента, чтобы обратиться к определенным данным. Для значений указателей предопределена константа Nil, её значение 0000:0000.
Существует два вида указателей: типизированные и нетипизированные. Они между собой совместимы, но несовместимы те величины, на которые они указывают. Кроме того, существуют три зарезервированных указателя:
HeapOrg - содержит в себе адрес начала кучи, который не изменяется в процессе выполнения программы.
HeapPtr - содержит в себе адрес начала непрерывного, ещё неиспользованного участка кучи. Каждый раз, когда в куче размещается новая величина, значение этого указателя изменяется на размер этой переменной.
FreePtr - указывает на конец кучи (список свободных блоков кучи).

Имя
пере менной, связанной с адресом