адрес указателя Дельфи

Скажем, функция - это блок кода (обычно со своей областью действия, а иногда со своим собственным замыканием), который может принимать некоторые аргументы и также может возвращать результат.

Метод - это функция, которой владеет объект (в некоторых объектно-ориентированных системах правильнее будет сказать, что он принадлежит классу). «Владение» объектом / классом означает, что вы обращаетесь к методу через объект / класс; например, в Java, если вы хотите вызвать метод "open ()", принадлежащий объекту "door", вам нужно написать "door.open ()".

Обычно методы также получают некоторые дополнительные атрибуты, описывающие их поведение в объекте / классе, например: видимость (связанная с объектно-ориентированной концепцией инкапсуляции), которая определяет, из каких объектов (или классов) метод может быть вызван .

Во многих объектно-ориентированных языках все «функции» принадлежат некоторому объекту (или классу), поэтому в этих языках нет функций, которые не являются методами.

13
задан Matt 12 June 2013 в 16:39
поделиться

4 ответа

Чтобы получить адрес чего-либо, используйте оператор @ или функцию 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 |
       +----------+

Наконец, когда вы отображаете результаты формата сверху, вы увидите это значение:

00002468 -> 0000246C -> 32342
33
ответ дан 1 December 2019 в 17:48
поделиться

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

IIRC, есть также спецификатор формата строки (% x?% P?), Который автоматически отформатирует его как восьмизначную шестнадцатеричную строку.

5
ответ дан 1 December 2019 в 17:48
поделиться

На самом деле вам нужен ULong:

2
ответ дан 1 December 2019 в 17:48
поделиться

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

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

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

3
ответ дан 1 December 2019 в 17:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: