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

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

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

Динамические переменные, как правило, имеют тип "запись" (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.

Динамические структуры данных

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

Взято из: Г.Л. Семашко, А.И. Салтыков «Программирование на языке Паскаль».
Схема переработана.