Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Teoria 158783 .doc
Скачиваний:
8
Добавлен:
25.09.2019
Размер:
1.72 Mб
Скачать

Раздел 6.Ссылочный тип (тип указатель) Общие сведения

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

Var

X: Integer;

Здесь X – автоматическая переменная.

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

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

Для работы с динамическими переменными в языке Паскаль предусмотрен ссылочный тип (тип указатель). Значением этого типа является ссылка на какой-либо элемент программы. По данной ссылке осуществляется непосредственный доступ к этому элементу. В качестве ссылки используется адрес соответствующего элемента в памяти машины.

Синтаксическая диаграмма задания типа указатель имеет вид, который представляет Рисунок 6 .46.

На данной диаграмме <Идентификатор_типа> - это тип динамически размещаемой переменной. В качестве типа может быть использовано имя стандартного или описанного отдельно типа.

Из диаграммы видно, что в Паскале имеется два вида указателейуказатель на элемент некоторого типа (верхнее ребро синтаксической диаграммы) и указатель, не связанный с типом (Pointer).

Рисунок 6.46 - Синтаксическая диаграмма задания типа указатель

Пример 6.1.

Использование указателей при объявлении программных элементов.

Type

Mas = Array [1..10] Of Integer;

Admas = ^Mas; {Admas – тип указателя на массив типа Mas}

P1 = ^Integer; {P1 – тип указателя на тип Integer}

Var

P: ^Integer; {в указателе P будет храниться адрес

динамической переменной целого типа}

Q: ^Char; {в указателе Q будет храниться адрес

динамической переменной типа Char}

Pp: P1; {в указателе Pр будет храниться адрес

динамической переменной целого типа}

Pt: Pointer; {в указателе Pt может храниться адрес

динамической переменной произвольного

типа}

Adrm: Admas; {в указателе Adrm будет храниться адрес

динамического массива типа Mas}

Указатели являются автоматическими переменными ссылочного типа.

Динамические переменные не объявляются в программе. Поэтому единственным средством доступа к ним являются указатели.

Связь указателя Р с динамической переменной схематически отображает Рисунок 6 .47.

Рисунок 6.47 - Связь указателя Р с динамической переменной

Указатель занимает четыре байта памяти.

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

Например, для указателей, объявленных в примере 6.1, можно записать:

Pt := Nil;

P := Nil;

Q := Nil;

Adrm := Nil;

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

Над значениями ссылочного типа определены только присваивание и две операции сравнения: = и <>.

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

При присваивании значения ссылочной переменной в правой части оператора присваивания используется ссылочное выражение того же типа, что и тип переменной в левой части. В качестве ссылочного выражения может использоваться:

  • пустая ссылка Nil;

  • ссылочная переменная;

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

Например, встроенная функция Addr(X) – возвращает адрес элемента X. Здесь X – любая переменная, процедура или функция. Результат функции Addr(X) совместим по присваиванию со всеми типами “указатель”. Поэтому можно, например, написать такие операторы присваивания (для переменных типа указатель, объявленных в примере 6.1):

Pt := Addr (А); {А может иметь любой тип}

P := Addr (В); {В должна иметь тип Integer}

Объявление ссылочной переменной в разделе Var не порождает самой динамической переменной. По этому объявлению транслятор только отводит место в памяти для размещения ссылки (адреса динамической переменной).

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