13

在德尔福:

如何获取指针指向的地址(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 是什么 :)

4

5 回答 5

35

获取某物的地址,请使用@运算符或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
于 2009-07-23T14:10:12.817 回答
5

只需将其转换为整数:)

IIRC,还有一个字符串格式说明符(%x?%p?),它将自动将其格式化为 8 个字符的十六进制字符串。

于 2009-07-23T13:47:27.087 回答
5

这是我自己的地址函数示例:

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;
于 2013-05-28T08:28:48.990 回答
3

GetAddressOf() 将返回变量的地址。

GetAddressOf(iptrValue) - the address of the iptrValue
GetAddressOf(iValue) - the address of iValue

你想要的是指针的值。为此,将指针转换为无符号整数类型(如果我没记错的话,长字)。然后您可以将该整数转换为字符串。

于 2009-07-23T13:51:29.267 回答
2

它实际上是您需要的 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;

我在Delphi 2006中没有找到GetAddressOf函数,好像是VB函数?

于 2009-07-23T14:06:30.043 回答