35. У К А З А Т Е Л И.
Операционная система 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 - имя переменной любого типа, в том
числе процедурного.
Переменные типа указатель не могут быть элементами списка ввода -
вывода.
36. Д И Н А М И Ч Е С К И Е П Е Р Е М Е Н Н Ы Е
Статической переменной (статически размещенной) называется описан-
ная явным образом в программе переменная, обращение к ней осуществля-
ется по имени. Место в памяти для размещения статических переменных
определяется при компиляции программы.
В отличие от таких статических переменных в программах, написанных
на языке ПАСКАЛЬ, могут быть созданы динамические переменные. Основ-
ное свойство динамических переменных заключается в том, что они соз-
даются и память для них выделяется во время выполнения программы.
Размещаются динамические переменные в динамической области памяти
(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
... ячейка, а имя переменной превращается в адрес ячейки. Появление этого адреса происходит в результате работы специального оператора языка (NEW), однако его значение в большинстве случаев не используется при программировании на алгоритмических языках типа Паскаль. Условимся считать, что адрес ячейки, которая будет хранить переменную А, есть А. Или, другими словами, А - это общее имя переменной и ...
... . Объясните, для чего служат разрешения и привилегии в Windows NT. Зав. кафедрой -------------------------------------------------- Экзаменационный билет по предмету СИСТЕМНОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ Билет № 22 Перечислите возможности и инструменты системы программирования Microsoft Developer Studio. Укажите для чего предназначается буфер в системах ввода-вывода, ...
... . Поэтому так легко путешествовать по Всемирной паутине (WWW — Worl Wide Web), переходя с сайта на сайт по гиперссылкам. Для отображения в «плоском* тексте смысловых связей между основными разделами или понятиями можно использовать гипертекст. Гипертекст позволяет структурировать документ путем выделения в нем слов-ссылок (гиперссылок). При активизации гиперссылки (например, с помощью щелчка мышью ...
... # будет тесно интегрирован с языком XML[1]. 2.2 Паскаль Паскаль [PASCAL - акроним с французского - Program Applique a la Selection et la Compilation Automatique de la Litterature] - Процедурно-ориентированный язык программирования высокого уровня, разработанный в конце 1960-х гг. Никлаусом Виртом, первоначально для обучения программированию в университетах. Назван в честь французского ...
0 комментариев