Подтвердить что ты не робот

Адрес указателя delphi

В 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 в действительности:)

4b9b3361

Ответ 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

Ответ 2

Просто добавьте его к целому числу:)

IIRC, также существует спецификатор строкового формата (% x?% p?), который автоматически форматирует его как шестнадцатеричную строку с 8 символами.

Ответ 3

GetAddressOf() вернет адрес переменной.

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

То, что вы хотите, это значение указателя. Для этого наведите указатель на целочисленный тип без знака (Longword, если я его правильно помню). Затем вы можете преобразовать это целое число в строку.

Ответ 4

Вот мой собственный пример функции адреса:

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;

Ответ 5

Это действительно 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?