Скажем, функция - это блок кода (обычно со своей областью действия, а иногда со своим собственным замыканием), который может принимать некоторые аргументы и также может возвращать результат.
Метод - это функция, которой владеет объект (в некоторых объектно-ориентированных системах правильнее будет сказать, что он принадлежит классу). «Владение» объектом / классом означает, что вы обращаетесь к методу через объект / класс; например, в Java, если вы хотите вызвать метод "open ()", принадлежащий объекту "door", вам нужно написать "door.open ()".
Обычно методы также получают некоторые дополнительные атрибуты, описывающие их поведение в объекте / классе, например: видимость (связанная с объектно-ориентированной концепцией инкапсуляции), которая определяет, из каких объектов (или классов) метод может быть вызван .
Во многих объектно-ориентированных языках все «функции» принадлежат некоторому объекту (или классу), поэтому в этих языках нет функций, которые не являются методами.
Чтобы получить адрес чего-либо, используйте оператор @
или функцию 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
Просто приведите его к целому числу :)
IIRC, есть также спецификатор формата строки (% x?% P?), Который автоматически отформатирует его как восьмизначную шестнадцатеричную строку.
GetAddressOf () вернет адрес переменной.
GetAddressOf(iptrValue) - the address of the iptrValue
GetAddressOf(iValue) - the address of iValue
Что вам нужно, так это значение указателя. Для этого приведите указатель к целочисленному типу без знака (Longword, если я правильно помню). Затем вы можете преобразовать это целое число в строку.