Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник_Часть_1.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
974.85 Кб
Скачать

X: integer;

begin

a:=@x;

a1:=@a;

a1^^:=10;

writeln(x) {10}

end.

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

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

Синтаксическая диаграмма определения типизированного указателя приведена на рис. 13.2.

Идентификатор базового типа

(любой тип, в том числе указатель)

Рис. 13.2. Синтаксическая диаграмма типизированного указателя

Например: type ip=^integer; rp=^real; и т. д.

var

a,b:ip;

c:rp;

d:pointer; …

g:^byte;

s:^string;

a1,b1:^ip;

В Паскале все идентификаторы должны быть описаны перед использованием. Указатели являются единственным исключением. Базовый тип может быть объявлен и сразу после указателя.

Например: type RecP=^spis;

spis=record

fio:string[20];

number:byte;

end;

«Пустой» указатель – это постоянная указательного типа. Обозначается Nil. Выделяется один адрес, в котором заведомо не может быть размещена никакая переменная. На это место и ссылается «нулевой» или «пустой» указатель.

Указатель, которому присвоено значение Nil, не содержит в себе никакого адреса. Указатель Nil считается постоянным, совместимым с любым ссылочным типом. Значит, его значение можно присваивать любому указателю. Nil используют для инициализации указателя «пустым» значением или когда его указание надо отменить. Это позволяет проверять значение указателя, прежде чем присвоить ему какое-либо значение.

13.3. Создание и уничтожение динамических переменных

Создание и удаление динамических переменных – это основные действия над динамическими переменными.

1. Типизированные объекты

New(x) – создает динамическую переменную, запрашивая в куче место для переменной соответствующего типа и возвращает адрес (х - переменная типа указатель).

Например: type vec = array [1..5] of integer;

var

s: ^vec;

p, q: ^real;

X: real;

. . . . . . . . . . . . . . . . . . . . . . . .

New(p);

New(s);

Для задания значения переменной, на которую ссылается указатель, необходимо указать символ ''^'' справа от указателя (рис. 13.3).

Имя пер. указателя ^ : = Значение

Рис. 13.3. Задание значения переменной, на которую ссылается указатель

П р и м е р ы:

  1. p^:=1.125; g:=p; write(g^); – будет напечатано число 1.125;

  2. p := @x: p^ := 10; – в результате в x окажется число 10;

  3. s^[1]:=3; for i:=2 to 5 do s^[I]:=random;

Если переменная больше не нужна, то можем ее уничтожить, вернув память в кучу.

Dispose(x) – x- типизированный указатель. Обычно используют для типизированных указателей.

2. Создание и уничтожение беcтиповых объектов

В этом случае мы можем запросить у кучи любое заданное количество байт и адрес начала этой области присвоить переменной типа pointer (но не байт одного сегмента).

GetMem(p: pointer; size: word) – создает новую динамическую переменную заданного размера size и переменную-указатель на нее.

FreeMem(p, size) – уничтожает динамическую переменную данного размера, size : word; p : pointer.