Лабораторный практикум по программированию на языке Паскаль. Найханова Л.В - 96 стр.

UptoLike

96
Для реализации косвенного доступа к переменной через указатель (ссылку) используется
операция, называемая разыменованием. В этом случае необходимо после переменной -
указателя поставить символ " ^ ". Например, запись
p1^
является переменной, на которую ссылается указатель p1.
Следовательно, операторы i := i+2 и p1^ := p1^+2 считаются эквивалентными.
Разыменование по определению имеет тип, совпадающий с базовым типом переменной -
указателя, в частности, p1^ является переменной целого типа. Разыменование допускается
для любых ссылочных типов. Например, для переменной OneMan допускаются конструкции:
OneMan^.Name := 'Иван';
if OneMan^.speciality = 22.01 then ...
В случае "указатель на указатель" возможно многократное разыменование: например, для
переменной pp1 допустима конструкция
pp1^^,
которая имеет статус целой переменной.
Разыменование считается некорректным, если ссылочная переменная имеет значение NIL. В
этом случае не существует переменной, на которую ссылается указатель, поэтому
операторы:
p1 := nil;
p1^ := 2;
являются недопустимыми, хотя и не приводят к аварийному их прекращению.
13.5. Динамические переменные. Динамическая память
Переменные, для которых память распределяется автоматически, называются статическими.
Статические переменные описываются в разделах описаний в каком-либо блоке Паскаль -
программы и обозначаются идентификатором.
Переменные, созданием и уничтожением которых может явно управлять программист,
называются динамическими переменными. Динамические переменные, количество которых
и место расположения в памяти заранее не известно, невозможно обозначить
идентификатором. Поэтому единственным средством доступа к динамическим переменным
является указатель, который указывает текущий адрес ячейки памяти.
Следует отметить, что для распределения памяти под статические переменные отводится
специальный сегмент оперативной памяти (сегмент данных). Аналогично, образование
динамической переменной реализуется в другой области оперативной памяти, которая
существует отдельно от сегмента данных и называется кучей или динамической областью
памяти.
13.5.1. Основные действия над динамическими переменными
1. Процедура NEW предназначена для создания динамических переменных и имеет вид:
New (< имя ссылочной переменной >);
2.
Процедура DISPOSE удаляет переменную, на которую указывает значение ссылочной
переменной, и имеет вид: Dispose (< имя ссылочной переменной >);
Например:
Var
P : ^ Person;
Begin
New (P); {В куче отводится область памяти, достаточной для хранения записи типа
Person}
< Действия с указателем P >
Dispose (P) {Область памяти, занимаемая удаляемой переменной, возвращается в
кучу и может быть использована для других переменных}
End.
Для реализации косвенного доступа к переменной через указатель (ссылку) используется
операция, называемая разыменованием. В этом случае необходимо после переменной -
указателя поставить символ " ^ ". Например, запись
       p1^
является переменной, на которую ссылается указатель p1.
Следовательно, операторы i := i+2 и p1^ := p1^+2 считаются эквивалентными.
Разыменование по определению имеет тип, совпадающий с базовым типом переменной -
указателя, в частности, p1^ является переменной целого типа. Разыменование допускается
для любых ссылочных типов. Например, для переменной OneMan допускаются конструкции:
       OneMan^.Name := 'Иван';
       if OneMan^.speciality = 22.01 then ...
В случае "указатель на указатель" возможно многократное разыменование: например, для
переменной pp1 допустима конструкция
       pp1^^,
которая имеет статус целой переменной.
Разыменование считается некорректным, если ссылочная переменная имеет значение NIL. В
этом случае не существует переменной, на которую ссылается указатель, поэтому
операторы:
       p1 := nil;
       p1^ := 2;
являются недопустимыми, хотя и не приводят к аварийному их прекращению.
13.5. Динамические переменные. Динамическая память
Переменные, для которых память распределяется автоматически, называются статическими.
Статические переменные описываются в разделах описаний в каком-либо блоке Паскаль -
программы и обозначаются идентификатором.
Переменные, созданием и уничтожением которых может явно управлять программист,
называются динамическими переменными. Динамические переменные, количество которых
и место расположения в памяти заранее не известно,            невозможно обозначить
идентификатором. Поэтому единственным средством доступа к динамическим переменным
является указатель, который указывает текущий адрес ячейки памяти.
Следует отметить, что для распределения памяти под статические переменные отводится
специальный сегмент оперативной памяти (сегмент данных). Аналогично, образование
динамической переменной реализуется в другой области оперативной памяти, которая
существует отдельно от сегмента данных и называется кучей или динамической областью
памяти.
13.5.1. Основные действия над динамическими переменными
1. Процедура NEW предназначена для создания динамических переменных и имеет вид:
   New (< имя ссылочной переменной >);
2. Процедура DISPOSE удаляет переменную, на которую указывает значение ссылочной
   переменной, и имеет вид: Dispose (< имя ссылочной переменной >);

Например:
Var
      P : ^ Person;
Begin
      New (P); {В куче отводится область памяти, достаточной для хранения записи типа
      Person}
      < Действия с указателем P >
      Dispose (P) {Область памяти, занимаемая удаляемой переменной, возвращается в
      кучу и может быть использована для других переменных}
End.


                                                                                   96