Для доступа к переменной имеются две возможности: первая - использовать идентификатор переменной, вторая - воспользоваться адресом этой переменной, который содержится в указателе на эту переменную.
Например, чтобы увеличить значение переменной I, на которую указывает указатель Р: по первому способу можно записать: I:=I+2. Для реализации второго, косвенного доступа к переменной по указателю, используется разыменование указателя. Правило разыменования таково: для того чтобы по указателю на переменную получить доступ к самой переменной, нужно после переменной-указателя поставить знак ^. Так, запись: Writeln(Int2^) означает напечатать значение переменной, на которую ссылается указатель Int2. Поэтому чтобы увеличить значение переменной I, на которую указывает указатель Р, используя косвенный доступ к переменной по указателю, можно записать: Р ^:= P^ + 2.
Разыменование допускается для любых ссылочных типов. В случае использования указателя на указатель возможно многократное разыменование. Разыменование считается некорректным, если ссылочная переменная имеет значение Nil, т. е. в этом случае не существует переменной, на которую ссылается указатель.
|
|
Управление динамической памятью
Вся динамическая память в Турбо Паскале рассматривается как сплошной массив байтов, который называется кучей. Физически куча располагается в старших адресах сразу за областью памяти, которую занимает тело программы.
Начало кучи хранится в стандартной переменной HeapOrg, конец - в переменной HeapEnd. Текущую границу незанятой динамической памяти указывает указатель HeapPtr.
Для управления кучей используются следующие стандартные процедуры и функции.
Процедуры динамического распределения
Dispose Уничтожает динамическую переменную
FreeMem Уничтожает динамическую переменную данного размера
GetMem Создает новую динамическую переменную заданного размера и устанавливает переменную-указатель для нее
Mark Записывает в переменной-указателе состояние кучи
New Создает новую динамическую переменную и устанавливает на нее переменную-указатель
Release Возвращает кучу в заданное состояние
Функции динамического распределения
MaxAvail Возвращает размер наибольшего непрерывного свободного блока кучи, соответствующей размеру наибольшей динамической переменной, которая может быть распределена в момент вызова MaxAvail
MemAvail Возвращает количество имеющихся в куче свободных байтов