![]() |
В языке C и C++ существуют указатели. Естественно понятно, что они указывают на определенную ячейку памяти.
C++: Код:
// Я знаю что ссылки могут обьявляться следующим образом. |
Цитата:
Код:
*А *(int*) - это вроде как старый вариант переобразования типов |
Да, *(int*)0xBAB230 это разыменование указателя на int, *(int*) используется для приведения указателя на void к указателю на int
Цитата:
Альтернативный вид это конструкции, будет выглядеть как C++: Код:
**reinterpret_cast(0xBAB230) возвращает значение переменной, находящейся по адресу 0xBAB230 |
Цитата:
Для языка C++ нужно/можно приводить static_cast, const_cast, dynamic_cast, reinterpret_cast. Так и СИ-шным вариантом выше. Код: Код:
// Как я понимаю мы копируем значение переменной из адреса предварительно приведя к типу указателя int и последующим его разыменованием. |
C++:
Код:
intКод:
(int*)C++: Код:
intКод:
0xBAB230Код:
reinterpret_castВ данном случае она нужна для преобразования числа в указатель, на уровне системы типов языка. В результате этого выражения получается указатель, который указывает на адрес Код:
0xBAB230Код:
*(reinterpret_cast(...));Фактически работает примерно так: звездочка около типа заменяется амперсандом(ссылкой) Код:
*(T*) -> (T&)После этого ссылка на Код:
intЕсли говорить очень грубо - ссылка это всегда разыменованный указатель, который не может быть НЕ ИНИЦИАЛИЗОВАН и НЕ МОЖЕТ БЫТЬ ИЗМЕНЕН(сам адрес ссылки) В результате выражения, получается ссылка типа Код:
intКод:
0xBAB230Код:
0xBAB230Код:
int'ом |
Цитата:
Унарный оператор * над указателем на T это T (lvalue). Ссылка на T (т.е. T&) может быть инициализирована объектом типа T (не T&). Так как любое lvalue явно идентифицируется в памяти, обращение к ссылке под капотом будет ссылаться к адресу, в котором расположен этот lvalue Цитата:
Ссылочный тип данных - это новояз именно C++. Сохраняя общую семантику указателей (в частности, техническую часть), он становится более безопасным и предпочитаемым типом нежели указатель, так как:
Окей, предположим, что мы хотим пользоваться этой вашей крутой ссылкой хваленой, но нужно это для адреса 0xBAB230: C++: Код:
// ** давайте не будет придираться к тому, что не всегда sizeof(int) == sizeof(int*) |
Ссылка это обертка над указателем. Для компилятора запись
Код:
int &x = *(int*)0x123Код:
int *x = &(*(int*)0x122)Код:
int *x = (int*)0x123 |
Цитата:
|
Цитата:
Код:
intСсылка - это левая часть, ее тип - lvalue reference to int. Справа - выражение, которое после вычисления *((T*)ptr) будет lvalue выражением, но типа T, а не lvalue reference T& Даже явный каст к T& ничего не дает, он все равно неявно преобразуется к T и инициализирует ссылку, как и сказано в стандарте C++: Код:
intГде стандартом обозначено, что *(T*) == (T&) т.е. разыменование указателя равняется T& а не T? |
Цитата:
*ptr дает lvalue на T, и уже в момент присвоения категория lvalue материализуется в тип, и там получается T& |
| Время: 06:19 |