КАТЕГОРИИ: Архитектура-(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) |
Д и н а м и ч е с к и е п е р е м е н н ы е
У К А З А Т Е Л И. Операционная система MS - DOS все адресуемое пространство делит на сегменты. Сегмент - это участок памяти размером 64 К байт. Для зада- ния адреса необходимо определить адрес начала сегмента и смещение от- носительно начала сегмента. В TURBO PASCAL определен адресный тип Pointer - указатель. Пере- менные типа Pointer
var p: Pointer;
содержат адрес какого - либо элемента программы и занимают 4 байта, при этом адрес хранится как два слова, одно из них определяет сег- мент, второе - смещение. Переменную типа указатель можно описать другим способом.
type NameType= ^T;
var p: NameType;
Здесь p - переменная типа указатель, связанная с типом Т с помощью имени типа NameType. Описать переменную типа указатель можно непос- редственно в разделе описания переменных:
var p: ^T;
Необходимо различать переменную типа указатель и переменную, на которую этот указатель ссылается. Например если p - ссылка на пере- менную типа Т, то p^ - обозначение этой самой переменной. Для переменных типа указатель введено стандартное значение NIL, которое означает, что указатель не ссылается ни к какому объекту. Константа NIL используется для любых указателей. Над указателями не определено никаких операций, кроме проверки на равенство и неравенство. Переменные типа указатель могут быть записаны в левой части опера- тора присваивания, при этом в правой части может находиться либо функция определения адреса Addr(X), либо выражение @ X, где @ - унар- ная операция взятия адреса, X - имя переменной любого типа, в том числе процедурного. Переменные типа указатель не могут быть элементами списка ввода - вывода.
Статической переменной (статически размещенной) называется описан- ная явным образом в программе переменная, обращение к ней осуществля- ется по имени. Место в памяти для размещения статических переменных определяется при компиляции программы. В отличие от таких статических переменных в программах, написанных на языке ПАСКАЛЬ, могут быть созданы динамические переменные. Основ- ное свойство динамических переменных заключается в том, что они соз- даются и память для них выделяется во время выполнения программы. Размещаются динамические переменные в динамической области памяти (heap - области). Динамическая переменная не указывается явно в описаниях переменных и к ней нельзя обратиться по имени. Доступ к таким переменным осу- ществляется с помощью указателей и ссылок. Работа с динамической областью памяти в TURBO PASCAL реализуется с помощью процедур и функций New, Dispose, GetMem, FreeMem, Mark, Release, MaxAvail, MemAvail, SizeOf. Процедура New(var p: Pointer) выделяет место в динамической об- ласти памяти для размещения динамической переменной p^ и ее адрес присваивает указателю p. Процедура Dispose(var p: Pointer) освобождает участок памяти, выделенный для размещения динамической переменной процедурой New, и значение указателя p становится неопределенным. Проуедура GetMem(var p: Pointer; size: Word) выделяет участок памяти в heap - области, присваивает адрес его начала указателю p, размер участка в байтах задается параметром size. Процедура FreeMem(var p: Pointer; size: Word) освобождает учас- ток памяти, адрес начала которого определен указателем p, а размер - параметром size. Значение указателя p становится неопределенным. Процедура Mark(var p: Pointer) записывает в указатель p адрес начала участка свободной динамической памяти на момент ее вызова. Процедура Release(var p: Pointer) освобождает участок динамичес- кой памяти, начиная с адреса, записанного в указатель p процедурой Mark, то-есть, очищает ту динамическую память, которая была занята после вызова процедуры Mark. Функция MaxAvail: Longint возвращает длину в байтах самого длинно- го свободного участка динамической памяти. Функция MemAvail: Longint полный объем свободной динамической па- мяти в байтах. Вспомогательная функция SizeOf(X): Word возвращает объем в бай- тах, занимаемый X, причем X может быть либо именем переменной любого типа, либо именем типа. Рассмотрим некоторые примеры работы с указателями.
var p1, p2: ^Integer;
Здесь p1 и p2 - указатели или пременные ссылочного типа.
p1:=NIL; p2:=NIL;
После выполнения этих операторов присваивания указатели p1 и p2 не будут ссылаться ни на какой конкретный объект.
New(p1); New(p2);
Процедура New(p1) выполняет следующие действия: -в памяти ЭВМ выделяется участок для размещения величины целого типа; -адрес этого участка присваивается переменной p1:
г=====¬ г=====¬ ¦ *--¦--------->¦ ¦ L=====- L=====- p1 p1^
Аналогично, процедура New(p2) обеспечит выделение участка памяти, адрес которого будет записан в p2:
г=====¬ г=====¬ ¦ *--¦--------->¦ ¦ L=====- L=====- p2 p2^
После выполнения операторов присваивания
p1^:=2; p2^:=4;
в выделенные участки памяти будут записаны значения 2 и 4 соответ- ственно:
г=====¬ г=====¬ ¦ *--¦--------->¦ 2 ¦ L=====- L=====- p1 p1^
г=====¬ г=====¬ ¦ *--¦--------->¦ 4 ¦ L=====- L=====- p2 p2^
В результате выполнения оператора присваивания
p1^:=p2^;
в участок памяти, на который ссылается указатель p1, будет записано значение 4:
г=====¬ г=====¬ ¦ *--¦--------->¦ 4 ¦ L=====- L=====- p1 p1^
г=====¬ г=====¬ ¦ *--¦--------->¦ 4 ¦ L=====- L=====- p2 p2^
После выполнения оператора присваивания
p2:=p1;
оба указателя будут содержать адрес первого участка памяти:
г=====¬ г=====¬ ¦ *--¦--------->¦ 4 ¦ L=====- --->L=====- p1 ¦ p1^ p2^ ¦ г=====¬ ¦ ¦ *--¦------- L=====- p2
Переменные p1^, p2^ являются динамическими, так как память для них выделяется в процессе выполнения программы с помощью процедуры New. Динамические переменные могут входить в состав выражений, напри- мер:
p1^:=p1^+8; Write('p1^=',p1^:3);
Пример. В результате выполнения программы:
Program DemoPointer; var p1,p2,p3:^Integer; begin p1:=NIL; p2:=NIL; p3:=NIL; New(p1); New(p2); New(p3); p1^:=2; p2^:=4; p3^:=p1^+Sqr(p2^); writeln('p1^=',p1^:3,' p2^=',p2^:3,' p3^=',p3^:3); p1:=p2; writeln('p1^=',p1^:3,' p2^=',p2^:3) end.
на экран дисплея будут выведены результаты:
p1^= 2 p2^= 4 p3^= 18 p1^= 4 p2^= 4
Дата добавления: 2014-01-07; Просмотров: 266; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |