Ссылочные типы данных. Оператор new. Ссылка на какой-либо программный объект, по которой осуществляется непосредственный доступ к этому объекту

Страницы работы

Фрагмент текста работы

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 – ссылочное выражение, которое задает ссылочное  значение

Похожие материалы

Информация о работе