1 Ссылочные типы данных. В языке для работы с динамическими
объектами предусматривается специальный тип значений – так называемый ссылочный тип.Значением этого
типа является ссылка на какой-либо программный объект, по которой
осуществляется непосредственный доступ к этому объекту. На машинном языке такая
ссылка как раз и представляется указанием места в памяти (адресом)
соответствующего объекта. В этом случае для описания действий над динамическими объектами каждому
такому объекту в программе сопоставляется статическая переменная ссылочного
типа – в терминах этих ссылочных переменных и описываются действия над
соответствующими динамическими объектами. Значения же переменных ссылочного
типа, как обычно, определяются уже в процессе выполнения программы, а для
достаточно удобного формирования таких значений в языке предусмотрены
соответствующие средства. Динамические объекты и ссылки Как же задается ссылочный тип значений? В Паскале обязательно должен
фигурировать тип значений тех динамических программных объектов, на которые
будут указывать значения переменных задаваемого ссылочного типа. <имя типа>=<имя типа>,
где - это признак ссылочного типа, а <имя типа> - это имя либо
стандартного, либо ранее описанного типа значений. Значениями переменных
определенного таким образом ссылочного типа могут быть ссылки на динамические
объекты, причем только того типа, имя которого указано в задании после стрелки.
В задании ссылочного типа после стрелки может фигурировать только имя типа
динамического объекта, но не непосредственное его задание. Переменные ссылочного типа вводятся в
употребление обычным путем, с помощью их описания в разделе переменных, а их
тип тоже определяется либо путем непосредственного задания типа в описании
переменных, либо путем указания имени ранее описанного типа. Пример:
TYPE
массив
= ARRAY[1..100] OF INTEGER; динмас=массив;
VAR
P: INTEGER;
Q: CHAR;
рабмас:
динмас;
В силу этих описаний значением
переменной P может быть ссылка на динамический объект целого типа, значением
переменной Q - ссылка на динамический объект литерного типа, а значением переменной
Рабмас – ссылка на динамический объект, значением которого является массив из
ста целых чисел. У всех этих статических ссылочных переменных есть одна общая
черта – их значения указывают место в памяти соответствующего динамического объекта, поэтому переменные
ссылочного типа часто называют указателями. Ссылка
в статической памяти, данные в динамической.
-Раздел
кода
-Статическая
секция
Свободная
память – динамическая память.
Память выделяет диспетчер памяти.
переменная
ссылочного типа занимает 4 байта – это под адрес в оперативной памяти.
За
каждой переменной закреплён базовый тип. Там может быть скалярный или любой
другой тип за исключением файлового. Ссылочный
тип
->
type
C
=^
integer
;
var
A
:
C
;
A
– ссылка или указатель. она будет иметь значение, где будет иметь значение
адреса памяти, где будет объект целого типа.
2. Оператор new. Теперь рассмотрим вопрос о том, как же порождается сам динамический объект. Дело в том, что после введения в употребление ссылочной переменной в разделе описаний, она не ссылается ни на какой программный объект и даже не имеет в качестве своего значения пустой ссылки NIL. Таким образом, описание VAR V:T лишь вводит в употребление статическую переменную V ссылочного типа, но не вводит в употребление никакого программного объекта типа Т, на который будет указывать значение этой ссылочной переменной V. Это описание говорит лишь о том, что значениями переменной V могут быть ссылки на такие объекты. Для порождения же самого динамического объект служит стандартная процедура с именем NEW, обращение к которой производится с помощью оператора процедуры. В этом операторе процедуры задается один фактический параметр – ссылочная переменная, сопоставленная порождаемому динамическому объекту, например NEW(P). В результате выполнения оператора процедуры такого вида порождается новый объект типа, указанного в описании той ссылочной переменной, которая задана в качестве фактического параметра, и в качестве значения этой ссылочной переменной присваивается ссылка на этот вновь порожденный объект (с точки зрения машинной интерпретации это означает, что в памяти резервируется место для порождаемого объекта, а адрес начала этого места присваивается заданной ссылочной переменной). Обратим внимание на то, что при этом порожденному динамическому объекту не присваивается какого-либо значения, так что для динамического объекта процедура NEW играет ту же роль, что и описание для статического объекта. Как работать с динамическим объектом, то есть, как присваивать ему то или иное значение и как использовать это значение. Здесь основной вопрос состоит в том, как же в паскаль-программе ссылаться на динамический объект? Динамическим объектам, в отличие от статических, не дается имен в обычном понимании этого слова. Поэтому для ссылки на динамический объект в языке имеется такое понятие, как переменная с указателем: VAR R,P: INTEGER; При выполнении оператора процедуры NEW(P) порождается динамическая переменная типа INTEGER; если затем будет выполнен оператор присваивания P:=58 то упомянутой выше динамической переменной будет присвоено значение, равное 58. Переменная с указателем может быть использована в любых конструкциях языка, где допустимо использование переменных того типа, что и тип динамической переменной. R:=R+P+2; p:=p div 3; Действия над ссылками Над значениями ссылочного типа нет каких-либо операций, которые бы давали результат этого же типа. Присваивание. V:=E, где E – ссылочное выражение, которое задает ссылочное значение
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.