Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Указатели в Pascal и Delphi лекция.doc
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
156.16 Кб
Скачать

Лекция. Указатели Лекция. Указатели.

©Кащей Владимир Васильевич, МИЭТ, каф. ИУВС, тел. (095) 532-9882

Указатели и динамическая память

Все рассмотренные нами ранее типы данных содержат непосредственно данные. Теперь мы приступаем к изучению принципиально нового типа, содержащего совершенно другой тип информации – адрес области оперативной памяти, в которой хранятся данные.

Определение Указатель – переменная, содержащая адрес области памяти, в которой располагаются некоторые данные.

Указатель указывает на данные как, например, адресная книга содержит адрес (ссылку) для определенного человека или оглавление указывает номер страницы заголовка.

В Турбо-паскале указатели могут быть 2 типов:

1. типизированные,

2. нетипизированные.

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

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

Т

базовый тип

ипизированный указатель

Б

идентификатор типа

азовый тип

Н

pointer

етипизированный указатель

Примеры

1). Var

P1 : ^Integer;

P2 : ^Real;

Type

PersonPointer=^PersonRecord;

PersonRecord=Record

Name : String;

Job : String;

Next : PersonPointer;

End;

Здесь базовый тип PersonRecord является еще не описанным идентификатором. Этот случай является единственным исключением в турбо-паскале, когда еще не определенный тип используется для определения другой переменной. Если бы такое исключение не было сделано, то построение списков было бы невозможно. При этом, однако, этот еще не определенный на данный момент идентификатор должен быть описан в пределах этого блока.

1 элемент списка

указатель

2 Элемент списка

указатель

последний элемент списка

пусто

2). Var

pp : Pointer;

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

Несмотря на то, что значениями указателей являются адреса памяти, не всякие указатели могут обмениваться значениями друг с другом, а только такие, которые связаны с одним и тем же типом данных.

Пример.

Var

P1,p2 : ^Integer;

P3 : ^Real;

Pp : Pointer;

В этом случае p1:=p2 допустимо, а p1:=p3 – запрещено, так как p1 и p3 указывают на различные типы данных. Однако, такие ограничения не распространяются на нетипизированные указатели. То есть можно написать pp:=p3; p1:=pp, но что при этом получится? Получается, что устанавливаются ограничения и сразу же предоставляются средства для их обхода.

Значением переменной указателя может быть адрес, указывающий на переменную или Nil (пустое значение).

Если у нас имеется динамическая переменная и если на нее указывает переменная-указатель, то такая ссылка записывается в виде переменной-указателя, после которой ставится символ указателя (^).

Примеры: P1^, PersonPointer^.Name

Переменной-указателю можно присвоить значение:

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

  2. С помощью операции взятия адреса @, которая ориентирует переменную указателя на область памяти, содержащую существующую переменную, в том числе и переменную, имеющую идентификатор.

  3. С помощью функции Ptr, ориентирующей переменную на определенный адрес в памяти.