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

10.5.3. Определение размеров типов и переменных

Функция SizeOf (X) : Word возвращает объем в байтах, занимаемый X. Причем X может быть не только переменной, но также и идентификатором типа (рис. 10.3).

TYPE

ХТуре = Array [1..10, 1..10] of Byte;

CONST

L : Longint = 123456;

VAR

X : String;

BEGIN

WriteLn(SizeOf(Xtype): 10, SizeOf( L ): 10, SizeOf( X ))

END.

Рис. 10.3

Значение SizeOf(строка) всегда дает максимальное значение длины строки. Реальное значение дает функция Length.

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

Применительно к данным типа «объект» (OBJECT) эта функция должна использоваться более осторожно, так как у объектов может не быть заранее предопределяемого размера. Обсуждение этого можно найти в гл. 13. {193}

Глава 11. Ссылки, динамические переменные и структуры

Динамическими структурами данных считаются такие, размер которых в процессе работы программы заранее не известен или изменяется и (или) для которых место в памяти ПЭВМ отводится во время выполнения программы. Необходимость в динамических структурах данных обычно возникает в следующих случаях:

1. Используются переменные, имеющие довольно большой размер, необходимые в одних частях программы и совершенно не нужные в других, т.е. переменные, освобождающие память после их использования.

2. В процессе работы программы нужен массив или иная структура, размер которой изменяется в широких пределах и труднопредсказуем.

Кроме этих двух случаев, общих для различных версий Паскаля, при программировании на Турбо Паскале есть еще один. А именно: когда размер переменной (массива или записи) превышает 64K.

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

11.1. Ссылочные переменные

Основным механизмом для организации динамических данных является выделение в специальной области памяти, называемой «кучей», непрерывного участка (блока) подходящего размера и сохранения адреса начала этого участка в специальной переменной. Такие переменные называют ссылочными переменными или просто ссылками (reference). Часто используется синоним этого термина — «указатель» (pointer), но в Турбо Паскале это название имеет особый смысл.

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

TYPE

ИмяСсылочногоТипа = ^ИмяБазовогоТипа;

где ИмяБазовогоТипа — любой идентификатор типа. В результате {194} этого определения создаваемые затем ссылочные переменные будут указывать на объекты базового типа, определяя тем самым динамические переменные базового типа. Например:

TYPE { БАЗОВЫЕ ТИПЫ }

DimType = Array [1..10000] of Real; { массив } RecType = RECORD { запись }

...

END;

ObjType = OBJECT { объект }

...

END;

{ ССЫЛОЧНЫЕ ТИПЫ }

IntPtr = ^Integer; { ссылка на целое значение }

DimPtr = ^DimType; { ссылка на массив данных }

RecPtr = ^RecType; { ссылка на запись }

ObjPtr = ^ObjТуре; { ссылка на объект } XXXPtr = Pointer; { ссылка "вообще" — указатель }

Условимся называть в дальнейшем указателем, а не ссылкой те переменные, которые имеют обобщенный тип Pointer. Этот тип совместим со всеми прочими ссылочными типами.

J

адрес хранения

значения “123”

——→

123

Адрес J отличается

от адреса значения

Все ссылочные переменные имеют одинаковый размер, равный 4 байтам, и содержат адрес начала участка оперативной памяти, в котором размещена динамическая структура данных. Отношение между ссылочной переменной и объектом, на который она указывает, наглядно представлено на рис. 11.1. Здесь J — ссылочная переменная, указывающая на значение целого типа (VAR J : ^Integer). Сравните с простой переменной I типа Integer на том же рисунке.

I=123

Адрес I является адресом значения

Рис. 11.1

Чтобы ссылка ни на что не указывала, ей присваивается значение nil, например:

J := nil;

Это предопределенная константа типа Pointer, соответствующая адресу 0000:0000. {195}

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