7. ДИНАМИЧЕСКАЯ ПАМЯТЬ
95
7. Динамическая память
В предшествующих разделах использовались переменные, память под которые вы-
делялась статически, то есть на стадии компиляции. Эти области памяти (для переменных
из раздела VA R данного блока) существуют до конца работы блока, даже если эти пере-
менные уже не нужны. При этом память нередко используется неэффективно, достаточно
вспомнить «настройку» массива на фактическое количество элементов, а также, если, на-
пример, объявлено несколько массивов большого объема статической памяти, а в каждый
конкретный момент используются не все.
Исправить положение можно, применив специальный механизм распределения па-
мяти. Турбо Паскаль предоставляет возможность выделять и освобождать память в про-
цессе выполнения программы, динамически.
Можно отметить следующие достоинства динамической памяти:
– экономичность и эффективность ее использования;
– возможность динамического изменения числа элементов в связанных структурах, на-
пример, списках (в статической памяти число элементов фиксировано для каждой компиляции);
– статические переменные существуют только в течение жизни блока, в котором они
объявлены, а динамические – и после выхода из блока до окончания программы. Перемен-
ная, размещаемая динамически, не объявляется в разделе VAR и не имеет имени в программе
(«невидимка»). Компилятор не планирует выделение места в памяти под такие переменные.
7.1. Указатель
Обращение к участку динамической памяти в программе осуществляется с помо-
щью специальной ссылочной переменной, которая называется указателем (ссылкой).
Переменная типа «указатель» содержит адрес размещения участка динамической
памяти, с которой связан этот указатель. Компилятор отводит под переменную типа «ука-
затель» четыре байта статической памяти. Обычно указатель, связанный с определенным
типом данных, называется типизированным. Однако он может быть и не типизированным,
то есть совместимым с указателями любого типа данных. В этом случае указатель назы-
вается свободным (несвязанным).
Формат описания типа «указатель» следующий:
TYPE <идентификатор указателя>=^<тип>;
Примеры объявления типов «указатель» и переменных типа «указатель».
TYPE
{ правильные объявления типов}
P1=^WORD; {p1 – идентификатор типа «указатель» на данные типа WORD}
P2=^CHAR; {p2 – идентификатор типа «указатель» на данные типа CHAR}
P4=ARRAY[1..10] OF ^REAL; {p4 – идентификатор типа «указатель»
на массив указателей, ссылающихся на данные типа REAL}
{ неправильные объявления типов}
P5=^ARRAY[1..10] OF REAL;
P6=^STRING[25];
P7=^RECORD
FIELD1:STRING [15];