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は 4 バイト幅なので、 のアドレスは次の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

これが私自身の住所関数の例です:

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 に答える
5

整数にキャストするだけです:)

IIRC には、8 文字の 16 進文字列として自動的にフォーマットする文字列フォーマット指定子 (%x? %p?) もあります。

于 2009-07-23T13:47:27.087 に答える
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 に答える