→ Пошук по сайту       Увійти / Зареєструватися
Знання Мова програмування Pascal

Динамические переменные

Статической переменной (статически размещенной) называется описанная явным образом в программе переменная, обращение к ней осуществляется по имени. Место в памяти для размещения статических переменных определяется при компиляции программы.

В отличие от таких статических переменных в программах, написанных на языке ПАСКАЛЬ, могут быть созданы динамические переменные. Основное свойство динамических переменных заключается в том, что они создаются и память для них выделяется во время выполнения программы. Размещаются динамические переменные в динамической области памяти (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
загрузка...
Сторінки, близькі за змістом