Разыменование указателей
До сих пор мы видели, как можно присваивать указателям зна- чения, но если вы не можете получить значения обратно, польза от этого невелика. Разыменовав типизированный указатель, вы можете интерпретировать так, как если бы это была переменная типа, на которую он указывает. Чтобы разыменовать указатель, поместите символ каре (^) после идентификатора указателя.
Ниже показаны некоторые примеры разыменования указателя:
type PInteger = ^Integer;
var SomeNumber: Integer; { присвоить SomeNumber 17 } SomeAddress := @SomeNumber; { SomeAddress указывает на SomeNumber } Writeln(SomeNumber); { напечатать 17 } Writeln(SomeAddress); { не допускается; указатели печатать нельзя } Writeln(SomeAddress^); { напечатать 17 } AnotherAddress := SomeAddress; { также указывает на SomeNumber } AnotehrAddress^ := 99; { новое значение для SomeNumber } Writeln(SomeNumber); { напечатать 99 } end.
Пример 8.1 Простые примеры разыменования указателей.
Наиболее важными строками в Примере 8.1 являются следующие:
AnotherAddress := SomeAddress; { также указывает на SomeNumber } AnotehrAddress^ := 99; { новое значение для SomeNumber }
Если вы поймете разницу между этими двумя операторами, то поймете основные моменты в использовании указателей. Первый опе- ратор присваивает адрес переменной AnotherAddress; он сообщает ей, куда нужно указывать. Второй оператор присваивает новое зна- чение элементу, на который указывает AnotherAddress. На Рис. 8.1 графически показано, как изменяется переменная.
+----------++-----------++-----------++-----------+ SomeNumber | 17 17 17 99 | +----------|+-----------|+-----------|+-----------| | не | SomeAddress |определено@SomeNumber@SomeNumber@SomeNumber| +----------|+-----------|+-----------|+-----------| | не не | AnotherAddress|определеноопределено @SomeNumber@SomeNumber| +----------++-----------++-----------++-----------+ ^ ^ ^ ^ SomeNumber := 17; | | | SomeAddress := | | @SomeNumber; | | AnotherAddress | := SomeAddress: | AnotherAddress^ := 99;