Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция №10_ Адреса и указатели. Списочные струк....doc
Скачиваний:
4
Добавлен:
19.04.2019
Размер:
226.82 Кб
Скачать

Лекция №10. Адреса и указатели. Списочные структуры данных

Основные понятия и применение динамически распределяемой памяти. Списочные структуры данных и принципы работы с ними.

Содержание

Статически выделяемая память 1

Адреса 2

Указатели 2

Описание указателей 2

Операции с указателями 3

Определение адреса 3

Разыменование 3

Присваивания 4

Сравнения 4

Динамически распределяемая память 4

Динамическое выделение памяти 5

Типизированные указатели 5

Нетипизированные указатели 5

Динамическое освобождение памяти 6

Типизированные указатели 6

Нетипизированные указатели 6

Списочные структуры 6

Структура списков 7

Описание списков 7

Оперирование элементами списка 9

Хранение списка 9

Обращение к элементам списка 9

Создание списков 10

Просмотр элементов списка 11

Удаление элементов списка 11

Перестройка списков 11

Примеры перестройки линейных списков 12

Реализация 13

Статически выделяемая память

Для того, чтобы лучше понять специфику динамически выделяемой памяти, рассмотрим сначала ее "антипод" - память, распределяемую статически.

Такое выделение памяти используется всякий раз при объявлении "обычных" переменных в разделе var. Каждая переменная обладает двумя атрибутами: именем и описанием.

var a: integer;

Описание переменной нужно для того, чтобы компилятор знал, сколько ячеек памяти необходимо выделить для ее хранения. Память под статическую переменную выделяется один раз (до начала работы программы), и затем до конца работы выделенная область памяти считается "занятой" - никакая другая информация не может быть записана в эту ячейку.

Имя переменной позволяет обращаться в процессе работы программы к той ячейке памяти, которая была выделена под эту переменную на этапе компиляции.

Адреса

Имя переменной является ее своеобразным (буквенным) адресом. Однако у любой переменной есть также и обычный (цифровой или физический) адрес: номер ячейки, выделенной под эту переменную.

При страничной организации памяти адреса являются составными и состоят из номера сегмента памяти и смещения ячейки относительно начала этого сегмента.

Лучшая иллюстрация страничной организации памяти компьютера - это страничная организация любой печатной книги. Для того чтобы найти нужную строчку, нет необходимости задавать ее номер, считая от начала текста. Вместо этого можно задать сначала номер страницы ( = сегмент ) и только затем номер строки, считая от начала этой страницы ( = смещение ).

Для обращения к статически заданной переменной можно использовать как ее имя, объявленное в разделе var, так и ее физический адрес.

Например, " адрес " одной и той же географической точки можно записать по-разному: "49°47' северной широты и 86°36' восточной долготы" или просто "вершина пика Белуха Восточная".

Указатели

Для того чтобы хранить (цифровые) адреса, нужны особые переменные. Их называют указателями и относят к специальному типу данных.

Описание указателей

При описании типизированного указателя необходимо сообщить компилятору, адреса переменных какого типа он может хранить:

var <имя_указателя>: ^<тип_адресуемой_переменной>;

Например:

var p: ^integer;

q: ^real;

s: ^array[1..10] of byte;

Кроме того, существуют универсальные нетипизированные указатели, которые могут хранить адрес переменной любого типа:

var <имя_указателя>: pointer;