Адрес указателя 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?

Другие вопросы по тегам