Ответ 1
Чтобы получить адрес чего-либо, используйте оператор @
или Addr
. Вы уже продемонстрировали правильное использование этого. Вы получили адрес iValue
и сохранили его в iptrValue
.
Чтобы отобразить адрес, вы можете использовать функцию Format
для преобразования значения указателя в строку. Используйте строку формата %p
:
Edit1.Text := Format('%p -> %p -> %d', [@iptrValue, iptrValue, iptrValue^]);
Это отобразит адрес переменной iptrValue
, затем адрес, сохраненный в этой переменной, а затем значение, сохраненное по этому адресу.
Объявление переменной iptrValue
резервирует некоторые байты в памяти и связывает с ними имя. Предположим, что адрес первого байта $00002468
:
iptrValue
+----------+
$2468: | |
+----------+
Объявление iValue
резервирует еще одну часть памяти и, вероятно, будет смежно с предыдущей памятью декларации. Поскольку iptrValue
имеет ширину в четыре байта, адрес iValue
будет $0000246C
:
iValue
+----------+
$246c: | |
+----------+
Ящики, которые я нарисовал, пустые, потому что мы не обсуждали, какие значения имеют эти переменные. Мы обсуждали только адреса переменных. Теперь к исполняемому коду: вы пишете @iValue
и сохраните результат в iptrValue
, так что вы получите следующее:
iptrValue
+----------+ +----------+
$2468: | $246c |--->| |
+----------+ +----------+
iValue
+----------+
$246c: | |
+----------+
Next, you assign 32342 to `iValue`, so your memory looks like this:
iptrValue
+----------+ +----------+
$2468: | $246c |--->| 32342 |
+----------+ +----------+
iValue
+----------+
$246c: | 32342 |
+----------+
Наконец, когда вы показываете результаты функции Format
сверху, вы увидите это значение:
00002468 -> 0000246C -> 32342