Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции Динамические структуры.doc
Скачиваний:
16
Добавлен:
01.07.2025
Размер:
435 Кб
Скачать
☆

Адреса и указатели

За стоянием динамической памяти можно следить при помощи специально предопределённых в языке 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.

Существует два вида указателей: типизированные и нетипизированные. Они между собой совместимы, но несовместимы те величины, на которые они указывают. Кроме того, существуют три зарезервированных указателя:

  1. HeapOrg - содержит в себе адрес начала кучи, который не изменяется в процессе выполнения программы.

  2. HeapPtr - содержит в себе адрес начала непрерывного, ещё неиспользованного участка кучи. Каждый раз, когда в куче размещается новая величина, значение этого указателя изменяется на размер этой переменной.

  3. FreePtr - указывает на конец кучи (список свободных блоков кучи).