Адрес указателя delphi
В Дельфи:
Как получить адрес (0x2384293), на который указывает указатель?
var iValue := Integer;
iptrValue := PInteger;
implementation
procedure TForm1.Button1Click(Sender: TObject);
begin
iptrValue := @iValue;
iValue := 32342;
//Should return the same value:
Edit1.Text := GetAddressOf(iptrValue);
Edit2.Text := GetAddressOf(iValue);
Так что же такое GetAddress в реальности:)
5 ответов
Чтобы получить адрес чего-либо, используйте @
оператор или 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
Просто приведите его к целому числу:)
Во IIRC есть также спецификатор формата строки (%x? % P?), Который автоматически форматирует его как шестнадцатеричную строку из 8 символов.
Вот мой собственный пример адресной функции:
function GetAddressOf( var X ) : String;
Begin
Result := IntToHex( Integer( Pointer( @X ) ), 8 );
end;
Пример использования 2 одинаковых данных переменной:
type
TMyProcedure = procedure;
procedure Proc1;
begin
ShowMessage( 'Hello World' );
end;
var
P : PPointer;
Proc2 : TMyProcedure;
begin
P := @@Proc2; //Storing address of pointer to variable
P^ := @Proc1; //Setting address to new data of our stored variable
Proc2; //Will execute code of procedure 'Proc1'
end;
GetAddressOf() вернет адрес переменной.
GetAddressOf(iptrValue) - the address of the iptrValue
GetAddressOf(iValue) - the address of iValue
То, что вы хотите, это значение указателя. Для этого приведите указатель к целому типу без знака (длинное слово, если я правильно помню). Затем вы можете преобразовать это целое число в строку.
Это на самом деле ULong вам нужно:
procedure TForm1.Button1Click(Sender: TObject);
var iValue : Integer;
iAdrValue : ULong;
iptrValue : PInteger;
begin
iValue := 32342;
iAdrValue := ULong(@iValue);
iptrValue := @iValue;
//Should return the same value:
Edit1.Text := IntToStr(iAdrValue);
Edit2.Text := IntToStr(ULong(iptrValue));
Edit3.Text := IntToStr((iptrValue^); // Returns 32342
end;
Я не нашел функцию GetAddressOf в Delphi 2006. Кажется, это функция VB?