Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник.docx
Скачиваний:
36
Добавлен:
21.12.2018
Размер:
2.15 Mб
Скачать

Ссылочные и динамические переменные

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

Под ссылочную переменную транслятор отводит место в памяти машины; эта переменная имеет имя и явно упоминается в программе. Ссылочные переменные образуют новый тип данных – "ссылки" (указатели).

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

Пример. Пусть в памяти машины имеется динамическая переменная, содержащая поле целого значения 2 и поле ссылки (указатель) на другую компоненту связанной структуры (цепочки). Адрес данной переменной (ссылка) содержится в ссылочной переменной R.

Обозначим тип ссылочной переменной через point, а тип динамической переменной через ct. Тогда этот факт описывается следующим образом:

type

point = ^ct;

Говорят, что тип point указывает (ссылается) на компоненты типа ct, или тип point связан с типом ct.

Ссылочную переменную R можно описать двумя способами:

a)

type

point = ^ct;

var

R: point;

б)

var

R: ^ct;

Переменная R указывает на компоненту типа ct.

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

Например, компоненты, содержащие числа 5, 10, 15, 8, должны иметь еще информацию о том, где находится предыдущий элемент, т.к. это не массив и компоненты размещаются необязательно подряд.

Опишем тип таких данных, обозначив его ct. Очевидно, этот тип есть «запись» с двумя полями: полем целого значения (I) и полем ссылки (P):

type

ct = record

I: integer;

P: point

end;

Очевидно, ссылочная переменная, указывающая на такой тип данных, должна иметь тоже тип point. Опишем этот тип:

type

point = ^ct;

Как мы видим, возник порочный круг: для описания типа point привлекается понятие ct, а при описании типа ct необходимо использовать point.

Условились в этом случае сначала описывать тип ссылочной переменной, а затем уже тип компоненты:

type

point = ^ct;

ct = record

I: integer;

P: point

end;

Правила языка Паскаль только при описании ссылок допускают использование идентификатора (ct) до его описания; во всех остальных случаях, прежде чем упомянуть идентификатор, необходимо описать его тип. Рассмотрим схему образования цепочки динамических данных, содержащих числа 5, 10.

Машине необходимо произвести следующие действия:

  1. Найти и зарезервировать место в памяти для компоненты.

  2. Заслать ссылку на эту компоненту (адрес) в ссылочную переменную R.

  3. Присвоить полю I значение 5.

  4. Присвоить некоторой ссылочной переменной Q значение R (скопировать).

  5. Найти и зарезервировать место в памяти для новой компоненты.

  6. Заслать в переменную R адрес этой компоненты.

  7. Заслать в поле I значение 10.

  8. Заслать в поле P значение Q.

Последовательность подобных действий создает цепочку динамических переменных.

Процедура New

Резервирование места в памяти под динамическую переменную и засылка ее адреса в ссылочную переменную R выполняется при обращении new(R). При этом выделяется столько ячеек памяти, сколько требует динамическая переменная, с которой связана R. Эти все данные система получает из раздела описания типов в программе.

Динамические переменные, созданные посредством процедуры new(R), называют также указанными переменными (указатель R).

Пример. Пусть переменная R имеет тип point. Тогда при обращении к процедуре new(R) будет создана указанная переменная, в которой предусмотрено поле под значение типа integer и поле ссылки. При этом ссылочная переменная R содержит адрес указанной переменной. Через R^ обозначается сама указанная переменная; R^.I – поле целого значения I; R^. P – поле ссылки P.