Основные понятия и определения
При разработке программ часто возникает проблема, связанная с тем, что объем обрабатываемой в программе информации (соответственно и размер памяти, необходимой для хранения этой информации) неизвестен или может быть определен только в процессе работы программы.
Например, количество компонент файла можно определить только после того, как он будет открыт (после выполнения в программе оператора Reset).
Использовать такую удобную для обработки информации структуру данных, как массив, нельзя, если не известно количество его элементов.
Все объявления в разделе описания переменных требуют точного значения размерности (например, array[1..10]), так как на основе этой информации компилятор «распределяет» память для используемых в программе данных.
Статическое распределение памяти – это распределение памяти в процессе компиляции программы, то есть до начала ее выполнения.
Динамическое распределение памяти – это распределение памяти в процессе работы программы. Для получения памяти в этом случае в программе необходимо выполнить запрос к операционной системе (ОС). По этому запросу ОС выделяет память в динамической области оперативной памяти компьютера – «куче» (heap) и возвращает программе начальный адрес, выделенного участка оперативной памяти. Доступ к данным, значения которых расположены в выделенной динамической области памяти, требует использования в программе переменной, значением которой и будет возвращаемый ОС адрес. Такая переменная имеет специальный, ссылочный тип данных –указатель.
Снтаксис:
Type
<имя типа> = pointer;
<имя типа> = ^<идентификатор типа>;
Пример:
Type
T = pointer; {указатель не связан с определенным типом данных}
T1 = ^integer; {указатель связан с данными целого типа}
Var
{ переменные типа указатель}
ptr1: T;
ptr2: T1;
Для правильной работы с указателями очень важно четко различатьдва понятиязначение указателя и значение по указателю:
· значение самого указателя – адрес динамической памяти.
В приведенном выше примере это значение переменных ptr1, ptr2
· значение по указателю – значение данных,адрескоторых является значением указателя на эти данные. В программе такие значения обозначаются: <имя переменной типа указатель>^
Для указателей ptr1, ptr2значения по указателю будут обозначаться так: ptr1^, ptr2^.
Чтобы «почувствовать разницу» между значением указателя и значением данных, адресуемых этим указателем, рассмотрим следующую схему (рисунок 3.5):
Рисунок 3.5 – «Значение указателя» и «значение по указателю»
На рисунке 3.5:
§ После выполнения операции ptrY:= ptrXизменяется значение указателя ptrY и доступ к данным по предыдущему значению этого указателя потерян (данные превращаются в «мусор»)!
§ После выполнения операции ptrY^:= ptrX^изменяется значение данных по указателю ptrY.Значение указателя ptrY не изменяется!
В конце работы программы необходимо освободить выделенную память, то есть сообщить ОС, что динамическая область памяти, выделенная программе, может использоваться для других программ или в целях самой ОС.