СТАТИЧЕСКИЕ И ДИНАМИЧЕСКИЕ ПЕРЕМЕННЫЕ

 

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

Распределение памяти в упомянутых случаях производится автоматически. Переменные в этом случае называют статическими.

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

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

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

Отметим следующее обстоятельство системного характера. Для распределения памяти под локальные переменные отводится специальный сегмент оперативной памяти (сегмент стека), минимальный размер стека 1024 байт, максимальный 65520 байт. По умолчанию размер стека равен 16384 байта.

Образование динамических переменных реализуется в другой область памяти, которая называется кучей (heap) или динамической областью памяти, максимальный размер которой 655360 байт.

Множество значений, которые являются указателями, определяют ссылочные или указательные типы. Для описания ссылочных типов используется символ « ^» и идентификатор типа.

Например: type

P = ^integer;

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

Имея в программе определение ссылочного типа, можно по общим правилам описать переменные этого типа. Ссылочные типы в описаниях переменных можно задавать как посредством имен, так и явно.

Например: Var

P1,P2 : P;

Описание ссылочных типов – единственное исключение из общего правила, согласно которому все имена должен быть описаны перед использованием

Например, возможна запись: type

PP = ^BaseType;

если тип BaseType не описан. Однако в таком случае BaseType должен быть описан далее в той же части описания типов.

Например: type

PP = ^BaseType;

BaseType = record

x,y : real;

end;

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

Например, если имеется описание

Var

i : integer;

то применение этой операции к переменной i дает в качестве результата значение типа »указатель на целое».

P1 := @i; Р1 получит адрес переменной i.

Р1

i

 


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

Например, если есть A : array[1..10] of integer; то @a[i] имеет смысл »указателя на i-е целое в массиве А» и также может участвовать в присваивании:

P1 := @a[i];

Ссылочные типы можно образовывать от любых других типов, поэтому допустимо определение вида «указатель на указатель».

Например: Var

PP1 : ^P;

Переменная РР1 в качестве своих возможных значений имеет множество указателей, ссылающихся на указатели, которые в свою очередь, ссылаются на целые значения.

Рассмотрим: РР1 : @P1;

Связи оператора отобразим схемой:

РР1 P1 i

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

Над значениями ссылочных типов допускаются две операции: сравнение на равенство и неравенство. Эти операции проверяют, ссылаются ли два указателя на одно и тоже место в памяти.