11.1. Ссылочные переменные
Основным механизмом для организации динамических данных является выделение в специальной области памяти, называемой «кучей», непрерывного участка (блока) подходящего размера и сохранения адреса начала этого участка в специальной переменной. Такие переменные называют ссылочными переменными или просто ссылками (reference). Часто используется синоним этого термина — «указатель» (pointer), но в Турбо Паскале это название имеет особый смысл.
В Турбо Паскале для определения ссылочной переменной нужно описать ее как переменную, имеющую ссылочный тип. В качестве ссылочного можно использовать встроенный тип Pointer или любой другой тип, определенный пользователем следующим образом:
TYPE
ИмяСсылочногоТипа = ^ИмяБазовогоТипа;
где ИмяБазовогоТипа — любой идентификатор типа. В результате
- 195 -
этого определения создаваемые затем ссылочные переменные будут указывать на объекты базового типа, определяя тем самым динамические переменные базового типа. Например:
TYPE { БАЗОВЫЕ ТИПЫ }
DimType = Array [1..10000] of Real; { массив }
RecType = RECORD { запись }
...
END;
ObjType = OBJECT { объект }
...
| END;
{ ССЫЛОЧНЫЕ ТИПЫ }
IntPtr = ^Integer; { ссылка на целое значение }
DimPtr = ^DimType; { ссылка на массив данных }
RecPtr = ^RecType; { ссылка на запись }
ObjPtr = ^ObjТуре; { ссылка на объект }
XXXPtr = Pointer; { ссылка вообще — указатель }
Условимся называть в дальнейшем указателем, а не ссылкой те переменные, которые имеют обобщенный тип Pointer. Этот тип совместим со всеми прочими ссылочными типами.
Все ссылочные переменные имеют одинаковый размер, равный 4 байтам, и содержат адрес начала участка оперативной памяти, в котором размещена динамическая структура данных. Отношение между ссылочной переменной и объектом, на который она указывает, наглядно представлено на рис. 11.1. Здесь J — ссылочная переменная, указывающая на значение целого типа (VAR J : ^Integer). Сравните с простой переменной I типа Integer на том же рисунке.
Рис. 11.1
Чтобы ссылка ни на что не указывала, ей присваивается значение nil, например:
J := nil;
Это предопределенная константа типа Pointer, соответствующая адресу 0000:0000.
- 196 -