Показать сообщение отдельно

  #5  
Старый 31.03.2023, 06:50
kin4stat
Флудер
Регистрация: 06.11.2017
Сообщений: 2,759
С нами: 4483143

Репутация: 183


По умолчанию

C++:





Код:
int
&
addr
=
*
(
int
*
)
0xBAB230
;


Код:
(int*)
- C style cast, в данном случае эквивалентный код выглядит так:

C++:





Код:
int
&
addr
=
*
(
reinterpret_cast

(
0xBAB230
)
)
;


Код:
0xBAB230
- integer literal, интерпретируется как число.

Код:
reinterpret_cast
- преобразование числа 0xBAB230 типа int в указатель на int. Фактически данная конструкция ничего не делает.

В данном случае она нужна для преобразования числа в указатель, на уровне системы типов языка.

В результате этого выражения получается указатель, который указывает на адрес
Код:
0xBAB230
Далее идет
Код:
*(reinterpret_cast(...));
Разыменование указателя дает lvalue ссылку на тип под указателем.

Фактически работает примерно так: звездочка около типа заменяется амперсандом(ссылкой)

Код:
*(T*) -> (T&)
, где T - произвольный тип

После этого ссылка на
Код:
int
присваивается переменной addr.

Если говорить очень грубо - ссылка это всегда разыменованный указатель, который не может быть НЕ ИНИЦИАЛИЗОВАН и НЕ МОЖЕТ БЫТЬ ИЗМЕНЕН(сам адрес ссылки)

В результате выражения, получается ссылка типа
Код:
int
на адрес
Код:
0xBAB230
. Любые операции с этой переменной будут взаимодействовать с ячейкой памяти по адресу
Код:
0xBAB230
как с целым числом(
Код:
int'ом
)
 
Ответить с цитированием