Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛК№15.doc
Скачиваний:
9
Добавлен:
24.08.2019
Размер:
72.7 Кб
Скачать

4. Работа с указателями

При работе с указателями можно выделить четыре этапа:

  • объявление указателя,

  • формирование динамических данных (создание указателей на них),

  • использование динамических данных,

  • уничтожение ненужных указателей.

Для того чтобы определить значение указателя, нужно использовать процедуру new или присвоить значение другого указателя или константы NIL. В противном случае указатель окажется неопределенным, то есть в памяти под него не будет зарезервировано место.

Var Z1,Z2:Pointertype;

{

Z1 Z1^

?

Z2 Z2^

?

Z1 и Z2 не определены}

N ew(Z1); New (Z2);

{ Z1 и Z2 определены, но Z1^ и Z2^ не определены}

Z1 Z1^

10

Z2 Z2^

15

Z 1^:=10; Z2^:=15;

{Обычное присваивание значения переменным}

Z1 Z1^

10

Z2 Z2^

10

Z 2^:=Z1^;

{ Обычное присваивание значения переменным}

Z1 Z1^

40

Z2 Z2^

10

Z 1^:=40;

{ Обычное присваивание значения переменным}

Z

Z1 Z1^

40

Z2

2:=Z1;

{ Присваивание значения указателю!}

{Z2 указывает на другую переменную, чем прежде }

Z1 Z1^

50

Z2

Z 1^:=50

{ Обычное присваивание значения переменным}

{но Z2^ это та же переменная, что и Z1^}

{поэтому изменяется вместе с ней}

При присваивании значения Z2:=Z1, переменная Z2 забыла переменную, которая содержала в себе значение 10. Если на нее указывала лишь Z2, то вследствие такого присваивания она стала недостижимой.

Однако мы не можем себе позволить таких «недостижимых» переменных, потому, что для них уже отведена память, и если так делать продолжительное время, то память может неожиданно закончится. Поэтому необходимо освобождать память от неиспользуемых указателей. Для этого служит процедура dispose.

Задача 1.

Какие действия совершаются в каждой строке программы?

Var

A,C:integer; {переменные целого типа}

B,D:^Integer; {указатели на переменные целого типа}

E:^Real; {указатель на переменную вещественного типа}

Begin

New(B); New(D); New(E); {Определяем значения указателей и выделяем память}

B^:=234; {Присваиваем значение 234 области памяти, на которую ссылается

указатель B}

С:=456; { Присваиваем значение переменной C}

D:=B; {Присваиваем значение указателя B указателю D, т.е указатель D ссылается

на ту же область памяти, что и указатель B, таким образом D^=234}

B^:=С; {Присваиваем значение переменной С области памяти, на которую

ссылается B}

E^:=C+D^ {Присваиваем сумму значения переменной С и значения на которое

ссылается указатель D}

Dispose(B); Dispose(D); {Уничтожение указателей и освобождение памяти}

{ВНИМАНИЕ!!! Проверить, ничего не забыли? (Необходимо еще DISPOSE(E)) }

End.

Динамические переменные могут входить в состав выражений.

Пример:

p1^:=p1^+8; Write('p1^=',p1^:3);

Пример:

В результате выполнения программы:

Program DemoPointer;

var p1,p2,p3:^Integer;

begin

p1:=NIL; p2:=NIL; p3:=NIL;

New(p1); New(p2); New(p3);

p1^:=2; p2^:=4;

p3^:=p1^+Sqr(p2^);

writeln('p1^=',p1^:3,' p2^=',p2^:3,' p3^=',p3^:3);

p1:=p2;

writeln('p1^=',p1^:3,' p2^=',p2^:3)

end.

на экран дисплея будут выведены результаты:

p1^= 2 p2^= 4 p3^= 18

p1^= 4 p2^= 4

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]