Ссылочные типы.
До сих пор рассматривались только статические объекты. Это объекты, которые порождаются непосредственно перед выполнением программы, существуют в течении всего времени ее выполнения и размер которых (объем памяти необходимой для их размещения) не изменяется по ходу выполнения программы. Место в памяти машины, необходимое для хранения их значений, можно выделить еще на этапе трансляции исходного текста на язык машины.
В программе на алгоритмическом языке ссылка на программные объекты осуществляется путем указания их имен. На машинном языке ссылка на объект осуществляется путем указания его места в памяти машины (номер ячейки памяти, начиная с которой размещен этот объект). Положительной стороной использования статических объектов является то, что вся работа по размещению объектов в памяти и формированию ссылок на эти объекты выполняется на этапе трансляции.
Однако иногда мы не знаем не только размер того или иного программного объекта, но даже и того будет существовать этот объект или нет. Объекты, которые возникают в процессе выполнения программы или размер которых изменяется называют динамическими объектами. Кроме того, бывает, что какой-либо объект нужен не на все время выполнения программы, а на какую-то часть этого времени. Временные программные объекты могут занимать значительный объем памяти и одновременное существование таких объектов в ОП машины невозможно.
В Паскале для работы с динамическими объектами определен специальный тип значений – ссылочный тип. Значение этого типа – ссылка на какой либо программный объект, по которой осуществляется непосредственный доступ к этому объекту. Для описания действий над динамическими объектами каждому такому объекту в программе сопоставляется статическая переменная ссылочного типа – в терминах этих ссылочных переменных и описываются действия над динамическими объектами. Значения же переменных ссылочного типа определяются уже в процессе выполнения программы.
Динамические объекты и ссылки.
Синтаксически задание ссылочного типа определяется следующим образом:
<задание ссылочного типа>:^<имя типа>
где ^ – признак ссылочного типа. Значениями переменных определенного таким образом ссылочного типа могут быть ссылки на динамические объекты, причем только того типа имя которого указано в задании после ^.
type Massiv = array [1..100] of integer;
DinMas=^Massiv;
var p:^integer;
q:^char;
WorkMas:DinMas;
Значением переменной p может быть ссылка на динамический объект целого типа...У всех этих статических ссылочных переменны есть одна общая черта –их значения указывают место в памяти соответствующего динамического объекта, поэтому переменные ссылочного типа часто называют указателями.
В некоторых случаях возникает необходимость в качестве значения указателя принять такую ссылку, которая не связывает с данным указателем никакого объекта (пустую ссылку). Такое значение задается служебным словом nil и принадлежит любому ссылочному типу.
Описание
var v:^SomeType
лишь вводит в употребление статическую переменную v ссылочного типа (транслятор отводит место в памяти необходимое для размещения ссылки), но не вводит в употребление никакого программного объекта типа SomeType, на который будет указывать значение ссылочной переменной v. Для порождения самого динамического объекта служит стандартная процедура с именем New(). Единственный параметр этой процедуры – ссылочная переменная, сопоставленная порождаемому динамическому объекту. В результате выполнения порождается новый объект типа, указанного в описании фактического параметра, и в качестве значения этой ссылочной переменной присваивается ссылка на этот вновь порожденный объект (в памяти резервируется место для порождаемого объекта, а адрес начала этого места присваивается заданной ссылочной переменной). Процедура New играет ту же роль, что и описание для статического объекта.
var p:^integer;
r:integer;
begin
New(p);
p^:=58;
r:=r+p^+2;
p^:=p div 3;
end.