Основы программирования на C++, PASCAL
Ввод и вывод указателей не допускается. Рассмотрим пример. Пусть в программе описаны следующие указатели:
Var D,P:^Integer;
К: ^Boolean;
Тогда допустимыми являются операторы присваивания
D:=P; K:=Nil;
поскольку соблюдается принцип соответствия типов. Оператор K:=D ошибочен, так как базовые типы у правой и левой части разные.
Если динамическая величина теряет свой указатель, то она становится «мусором». В программировании под этим словом понимают информацию, которая занимает память, но уже не нужна.
Представьте себе, что в программе, в которой присутствуют описанные выше указатели, в разделе операторов записано следующее:
NEW(D); NEW(P) ;
{Выделено место в динамической памяти под
две целые переменные. Указатели получили
соответствующие значения)
D^:=3; Р^:=5;
{Динамическим переменным присвоены
значения}
P:=D;
{Указатели Р и D стали ссылаться на одну и
ту же величину, равную 3}
WriteLn(P",D^); {Дважды напечатается число 3}
Таким образом, динамическая величина, равная 5, потеряла свой указатель и стала недоступной. Однако место в памяти она занимает. Это и есть пример возникновения «мусора». На схеме, представленной на рис. 40, показано, что произошло в результате выполнения оператора Р:=D.
В Паскале имеется стандартная процедура, позволяющая освобождать память от данных, потребность в которых отпала. Ее формат:
DISPOSE(<указатель>);
Например, если динамическая переменная P^ больше не нужна, то оператор
DISPOSE(Р)
удалит ее из памяти. После этого значение указателя Р становится неопределенным. Особенно существенным становится эффект экономии памяти при удалении больших массивов.
В версиях Турбо Паскаля, работающих под управлением операционной системы MS DOS, под данные одной программы выделяется 64 килобайта памяти. Это и есть статическая область памяти. При необходимости работать с большими массивами информации этого может оказаться мало. Размер динамической памяти намного больше (сотни килобайт). Поэтому использование динамической памяти позволяет существенно увеличить объем обрабатываемой информации.
Следует отчетливо понимать, что работа с динамическими данными замедляет выполнение программы, поскольку доступ к величине происходит в два шага: сначала ищется указатель, затем по нему — величина. Как это часто бывает, действует «закон сохранения неприятностей»: выигрыш в памяти компенсируется проигрышем во времени.