Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторна робота 13 (4чт., СА-10).doc
Скачиваний:
3
Добавлен:
24.08.2019
Размер:
50.18 Кб
Скачать
  1. Ссылочные типы.

До сих пор рассматривались только статические объекты. Это объекты, которые порождаются непосредственно перед выполнением программы, существуют в течении всего времени ее выполнения и размер которых (объем памяти необходимой для их размещения) не изменяется по ходу выполнения программы. Место в памяти машины, необходимое для хранения их значений, можно выделить еще на этапе трансляции исходного текста на язык машины.

В программе на алгоритмическом языке ссылка на программные объекты осуществляется путем указания их имен. На машинном языке ссылка на объект осуществляется путем указания его места в памяти машины (номер ячейки памяти, начиная с которой размещен этот объект). Положительной стороной использования статических объектов является то, что вся работа по размещению объектов в памяти и формированию ссылок на эти объекты выполняется на этапе трансляции.

Однако иногда мы не знаем не только размер того или иного программного объекта, но даже и того будет существовать этот объект или нет. Объекты, которые возникают в процессе выполнения программы или размер которых изменяется называют динамическими объектами. Кроме того, бывает, что какой-либо объект нужен не на все время выполнения программы, а на какую-то часть этого времени. Временные программные объекты могут занимать значительный объем памяти и одновременное существование таких объектов в ОП машины невозможно.

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

  1. Динамические объекты и ссылки.

Синтаксически задание ссылочного типа определяется следующим образом:

<задание ссылочного типа>:^<имя типа>

где ^ – признак ссылочного типа. Значениями переменных определенного таким образом ссылочного типа могут быть ссылки на динамические объекты, причем только того типа имя которого указано в задании после ^.

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.