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

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

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

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

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

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

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

       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