Указатели и динамическая память

Оператор присоединения.

Для получения более компактной записи составных имен в ТР предусмотрен оператор присоединения WITH , который записывается в виде

With <список> DO оператор (простой или составной) .

Здесь With (с), Do (делать) – зарезервированные слова; <список> - это ссылки на имена переменных типа запись. Список может содержать несколько ссылок.

Пример использования оператора With.

 

 

 

Динамическая память - что это такое?

Для всех переменных, объявленных в программе, до начала выполнения программы выделяются ячейки памяти в одной непрерывной области оперативной памяти, называемой сегментом. Память выделяемая программе до начала ее выполнения называется статической.

Длина сегмента определяется архитектурой ЭВМ и обычно составляет 64 к (65536 б). Поэтому максимальный размер программы не должен превышать 64 к. Одним из способов увеличения памяти выделяемой программе является использование модулей, так как для модулей выделяется отдельный сегмент. Однако этот способ не дает желаемого результата если в программе используются большие массивы. Примером таких программ являются САПР РЭУ, в которых размер массивов зависит от количества узлов и компонентов в схеме, причем в разные моменты времени требуется разное количество памяти.

Выходом из такой ситуации является использование динамической памяти.

 

4.12.1. Динамическая память

Динамическая память - это часть оперативной памяти, которая может быть предоставлена программе в процессе ее выполнения. Переменные, для которых можно резервировать и освобождать память в процессе выполнения программы называются динамическими.

Размер динамической памяти можно изменять в широких пределах в процессе выполнения программы. Принято называть динамическую память «кучей». По умолчанию этот размер определяется всей доступной памятью ПК и как правило составляет не менее 200 - 300к.

В языке ТР средством для управления динамической памятью являются указатели. Указатель - это переменная, которая в качестве своего значения содержит адрес ячейки памяти. Различают типизированные и не типизированные указатели.

 

4.12.2. Типизированные указатели.

Типизированный указатель содержит адрес ячейки памяти, для которой известен тип значения данного, которое будет помещаться в эту ячейку памяти.

Форма объявления типизированного указателя:

имя : ^идт ;

где символ ^ является признаком того, что это указатель;

идт - идентификатор типа данного. На месте идт может располагаться стандартный тип или идентификатор типа. С помощью указателей можно размещать в динамической памяти любой из известных в Delphi типов данных.

Пример.

Var Y1 : ^ Extended;

Эта запись означает, что в программе будет присутствовать два значения в памяти: одно значение - это значение адреса ячейки памяти, второе значение - это ззначение вещественного типа. Переменная конкретного типа данных может занимать несколько байт памяти. Указатель адресует лишь первый байт ячейки, в которой хранится данное.

Пример.

область указателей область динамических переменных

адрес 5 6 22 23 24

23 86.5

ячейка ячейка

для хранения указателя У1 для хранения значения

то есть адреса ячейки в которой вещественного типа

хранится значение вещест типа

Доступ к ячейке памяти с адресом осуществляется по имени У1. Для доступа к ячейке памяти с значением вещественного типа надо к имени указателя добавить значек ^ , то есть У^. По адресу на который указывает указатель можно размещать значения данных и использовать их как простые переменные.

 

4.12.3. Нетипизированные указатели.

 

Эти указатели не связанные с каким либо конкретным типом данных. Они объявляются с помощью стандартного типа Pointer, например так

PA, PS : Pointer;

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

Память для значения данного соответствующего У1^ и для указателя отводится в процессе выполнения программы, причем программист может по своему усмотрению указать, когда надо выделить память для тех или иных динамических переменных и когда можно освободить эту динамическую память. Для этих целей есть две стандартные процедуры.

Процедура NEW (указатель) - выделяет динамическую память, то есть присваивает указателю адрес ячейки памяти, в которую можно помещать данные.

Процедура DISPOSE (указатель) - возвращает динамическую память в кучу. При выполнении этой процедуры только освобождается динамическая память, а сам указатель не изменяется. Для исключения возможных ошибок целесообразно после применения процедуры DISPOSE присвоить указателю нулевое значение, которое в ТР задается константой NIL.

Пример использования указателей.

Program ykaz;