Динамичные структуры данных
Для всякой объявленной в программе переменной компьютер выделяет область в оперативной памяти. Это может быть байт, ячейка, несколько ячеек – в любом случае начало выделяемой области имеет определенный числовой адрес. Обычно операции с адресами как бы за кадром. Однако бывают случаи, когда выделяемый под программу памятью желательно распорядиться более эффективно, чем это позволяют делать ранее изученные средства языка. В таких случаях весьма полезны указатели- объекты, хранящие информацию об адресах других программных объектов. Чаще всего указатели содержат информацию не только об адресах, но также о типах расположенных по этим адресам объектов. Предположим, что мы собираемся хранить в оперативной памяти величину типа integer. Тогда нам может пригодиться, например указатель P, определяемый следующим образом: Var P:^integer; «Домик», предваряющий имя типа хранимой в памяти величины (базового типа -integer), служит отличительным знаком типа-указателя. Это специальный тип, который, во-первых, сообщает системе, что в переменной P должен храниться адрес, а во вторых, не просто какой-то адрес, а адрес величины типа integer. С указателями можно производить не так много действий. Их можно друг с другом сравнивать (равно, не равно). Объявив переменную P, мы сообщаем компьютеру, что в ней будет храниться адрес, но сам адрес пока еще не назначен. Для того, чтобы компьютер реально выделил место в оперативной памяти и определил конкретный адрес для этого места, нужно применить оператор New(новый) New(P); Получить доступ к выделенному месту можно с помощью оператора «домик», записанного справа от указателя. Хотя знак «домик» и неприметен, он несет в себе огромную смысловую нагрузку. Между обозначениями P и P^ такая же разница, как между «Джеком» и «Домом, который построил Джек». В первом случае мы имеем дело с переменной P специального типа, во втором с переменной, на которую указывает P. Эту принципиальную разницу нужно очень хорошо усвоить. Две следующие строки программы демонстрируют доступ к переменной с помощью указателя: P^:=1;// переменной, на которую указывает P, присваивается 1 A:=P^;//переменной А присваивается содержание переменной, на которую указывает P Память можно освобождать Dispose(P); Указателю можно присвоить значение nil, указывающее на отсутствие ссылки на какой-либо объект.
|