Новости           

Программы

Turbo Pascal

Игры  

Документация

"Странности"

FAQ

Ссылки

Благодарности

Об авторе

 

Яндекс цитирования

                    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:

p1 p1^

Аналогично, процедура New(p2) обеспечит выделение участка памяти, адрес которого будет записан в p2:

После выполнения операторов присваивания

p1^:=2; p2^:=4;

в выделенные участки памяти будут записаны значения 2 и 4 соответ-
ственно:

p2 p2^

В результате выполнения оператора присваивания

p1^:=p2^;

в участок памяти, на который ссылается указатель p1, будет записано
значение 4:

После выполнения оператора присваивания

p2:=p1;

оба указателя будут содержать адрес первого участка памяти:

Переменные 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


На первую страницу

 

Rambler's Top100 Rambler's Top100
(с)Все права защищены

По всем интересующим вопросам прошу писать на электронный адрес

Hosted by uCoz