Ссылки динамические переменные
New(a); New(b); WriteLn(a^, ‘ ‘, b^);
Определены адреса a и b динамических переменных a^ и b^, но сами их значения пока не заданы, поэтому на экран будут выведены значения, оставшиеся в ячейках памяти с указанными адресами после решения предыдущей задачи. a^ := 3; b^ := 5; WriteLn(a^, ‘ ‘, b^); Обычное присваивание значений переменным: динамической переменной a^ присвоено значение 3, а динамической переменной b^ - значение 5. Эти же значения и выводятся на экран. a := b; WriteLn(a^, ‘ ‘, b^); Указателю a присвоено новое значение – значение адреса ячейки памяти, хранившееся в указателе b. Поэтому сейчас оба указателя хранят один и тот же адрес – адрес b. Они указывают на одну и ту же динамическую переменную b^. Адрес же динамической переменной a^ утерян, поэтому ее значение становится недоступным. Значит, на экран будут выведены два одинаковых числа, являющиеся текущими значениями переменных a^ и b^: 5 и 5. b := Nil; WriteLn(a^, ‘ ‘, b^);
Указатель b принимает значение пустой ссылки Nil – он перестает указывать на какую-нибудь динамическую переменную b^, поэтому нельзя выводить на экран ее значение. Таким образом, использование динамических переменных отличается следующим: 1. вместо описания самих динамических переменных в программе дается описание ссылок на них (статических переменных ссылочного типа), поставленных в соответствие одноименным динамическим переменным, 2. до своего использования каждая динамическая переменная должна быть порождена с помощью оператора New, 3. значение динамической переменной задается с помощью переменной с указателем, 4. к переменной с указателем можно применять все те операции, которые допустимы и для статической переменной того же типа. Над значениями переменных ссылочного типа – адресами динамических переменных – в Паскале кроме операции присваивания определены две операции сравнения: = и <>. Два значения ссылочного типа равны между собой, если они оба равны Nil, либо указывают на один и тот же динамический объект (ячейку памяти). Во всех остальных случаях имеет место неравенство. Если в процессе выполнения программы динамический объект, созданный оператором, например New(a), становится ненужным, то его можно уничтожить оператором Dispose(a). При этом динамический объект, на который указывает ссылочная переменная a , уничтожается, занимаемое им место в памяти освобождается, а значение переменной a становится неопределенным. Оператор Dispose уничтожает только сам динамический объект, но не указатель на него: New(a); New(b);
a^ := 3; b^ := 5;
Dispose(a); a := b;
b := Nil;
©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.
|