Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Объектные типы данных

Var

Var

Type

Var

Type

Var

Type

P = ^t;

 

где P – идентификатор типа указателя; t – идентификатор (не определение) типа элемента данных, на который ссылается указатель.

Типизированный указатель может быть определен в разделе переменных. Например, следующие объявления:

 

ipt: ^Byte;

cpt: ^Char;

 

означают, что переменная ipt представляет адрес области памяти, в которой хранится целое число, а cpt – адрес области памяти, в которой хранится символ.

Физическая структура адреса не зависит от типа и значения данных, хранящихся по этому адресу. Тем не менее, указатели ipt и cpt имеют разный тип, и поэтому оператор присваивания:

 

cpt:=ipt;

 

недопустим.

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

Пусть имеется описание:

 

Tarr = array [1..20] of Real;

 

Pint: ^Integer;

Parr: ^Tarr;

 

Для такого описания Pint – переменная, указывающая на элемент целого типа (целое число), а Parr – указатель адреса первого элемента массива вещественных чисел. Сами указатели являются статическими переменными и располагаются в сегменте данных, а элементы, на которые ссылаются указатели, занимают место в динамической памяти (рис. 2.4).

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

Указатели одного и того же типа можно сравнивать с помощью операций «=» и «<>». Переход от указателя к объекту ссылки производится с помощью операции разыменования, которая обозначается знаком ^, стоящим после имени указателя:

 

Pint^ – объект (целое число), на который указывает Pint;

Parr^ – массив вещественных чисел, на который ссылается переменная Parr.

 

 

   
20-й элемент массива
...
2-й элемент массива
1-й элемент массива
Целое число
 
Pint
Parr

 

Рис. 2.4. Размещение переменной типа Tarr в динамической памяти.

 

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

 

Pint^:=Pint^+3;

Parr^[i]:=0;

 

Переход от объекта к его адресу осуществляется операцией взятия адреса@ или функцией Addr. Если выполнить присваивания:

 

Pint:=@X;

 

или

 

Pint:=Addr(X);

 

то будет:

 

Pint^:=X

 

Таким образом, операция взятия адреса является обратной к операции разыменования.

Для динамического распределения памяти существуют стандартные процедуры. Процедура New(P) где P – указатель, позволяет выделить область памяти такого размера, в котором можно разместить величину базового типа. Указатель принимает значение адреса выделенной области.

Процедура Dispose(P), позволяет освободить область памяти, на которую указывает указатель P, для последующего использования. После выполнения процедуры значение указателя P становится неопределенным.

Процедура GetMem(P, Size) позволяет выделить в динамической памяти область размером Size байт, при этом адрес выделенной области присваивается переменной P.

Процедура FreeMem(P, Size) освобождает занятую область памяти с адресом, задаваемым оператором P и размером Size байт. После выполнения процедуры область памяти становится свободной, а значение указателя оказывается неопределенным.

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

Рассмотрим несколько типичных приемов работы с указателями. Пусть имеется описание:

 

PComplex = ^TComplex; { тип-указатель }

TComplex = record { определение базового типа }

Re, Im: Real;

end;

 

AdrInt = ^Integer; { тип-указатель }

 

X: TComplex;

P1,P2,P3,P4: PComplex;

Adr: AdrInt;

 

тогда возможны следующие операции:

 

New(P1); { выделение памяти для типа TComplex }

New(Adr); { выделение памяти для типа Integer }

P2:=@X; { определение адреса переменной X }

P3:=P1; { присвоение значения другого указателя }

P4:=nil; { присвоение значения nil – «пустая» ссылка, не указывающая

ни на какой объект, «адресный ноль» }

X:=P1^; { переменной X присваивается значение

элемента, на который указывает P1 }

P3^:=X; { элементу, на который указывает P3,

присваивается значение переменной X }

X:=@Y; { X – адрес параметра Y }

 

После работы с указателями, следует обязательно освободить память, занимаемую теми объектами, на которые они указывают:

 

Dispose(P1); { освобождение памяти от данных, на которые указывает P1 }

New(Adr);

 

Нетипизированные указатели. В языке Паскаль существует стандартный тип-указатель Pointer, не связанный с базовым типом. Нетипизированный указатель совместим с любым другим типом-указателем. Переменная типа Pointer содержит адрес объекта неопределенного типа.

Пусть имеются следующие описания:

 

p1: ^Char;

p2: ^Boolean;

pp: Pointer;

 

Использование указателей типа Pointer позволяет динамически размещать с одного адреса данные различных типов. Напомним, присваивание значения одного указателя другому возможно только между указателями объектов идентичного типа. В примере символьный и булевый тип занимает одинаковый объем памяти (1 байт), однако следующая запись некорректна:

 

p1:=p2;

 

Нетипизированный указатель совместим по присваиванию с указателем любого типа, поэтому присваивание между p1 и p2 можно выполнить опосредованно:

 

pp:=p2;

p1:=pp;

 

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

Контрольные вопросы

1. Перечислите порядковые типы. Опишите общие операции над порядковыми типами.

2. Символьный тип. Как строятся кодовые таблицы?

3. Приведите примеры создания и использования перечисляемого и интервального типа.

4. Назначение и представление логического и битового типа.

5. Перечислите наиболее грубые ошибки численных расчетов.

6. Создание и применение указателей. Виды указателей и операции.

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

<== предыдущая лекция | следующая лекция ==>
Указательный тип | Директивы видимости
Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 692; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.025 сек.