Следующие функции предназначены для резервирования в оперативной памяти места под динамические переменные:
NEW(указатель) – выделяет кусок в динамической памяти и записывает его адрес в переменную – указатель
DISPOSE(указатель) – освобождает ранее захваченный кусок памяти и присваивает указателю значение NIL. Указатель, значение которого равно NIL:, указывает "в никуда", и с ним не связано никакой динамической памяти.
Самое главное: сколько памяти захватили, столько и вернули. Число команд NEW должно строго равняться числу команд DISPOSE. Например:
VAR p:^WORD;
BEGIN
{ выделили 2 байта и записали их адрес в р}
New(p);
…
{ вернули 2 байта и записали в p NIL }
Dispose(p)
END.
А как работать со значением динамической переменной? Очень просто – если после имени переменной-указателя поставить галочку "^", то это будет означать обращение не к переменной-указателю, а к значению, на которое эта переменная указывает. Иными словами, если p – указатель на область памяти;
то p^ - значение, хранящееся в этой области. Рассмотрим пример:
VAR p:^WORD;
BEGIN
New(p);
p^:=200:
Label1.Caption:=FloatToStr(p^*2);
Dispose(p)
END.
Может возникнуть резонный вопрос: если с каждой динамической переменной связана статическая переменная-указатель, то стоит ли весь сыр-бор заводить? Да, стоит. Во-первых, размер динамической переменной можно поменять "на ходу". Во-вторых, указатели на массив из десяти и миллиона элементов занимают совершенно одинаковый объем.