2016-05-14 5 views
1

Когда я запускаю этот код:печать адреса переменных

uint8_t stackVar = 0; 
void* ptr = &stackVar; 
uint8_t& ref = reinterpret_cast<uint8_t&>(ptr); 
std::cout << (void*)&ref << std::endl; 
std::cout << ptr << std::endl; 
std::cout << (void*)&stackVar << std::endl; 

я получаю этот выход:

0x22fe30 
0x22fe3f 
0x22fe3f 

По крайней мере, в моей оценке, я должен получить тот же номер для всех этих трех утверждений. Что здесь происходит?

+2

Вы делаете предположения о том, как ссылки реализуются –

+0

'& ref' это адрес ссылки на указатель. Почему вы ожидаете, что он будет равен самому указателю? –

+0

Я думаю, что OP путается в том, что '&' имеет два значения. '&' В первом cout означает 'address-of', а не' reference'. – PaulMcKenzie

ответ

2

uint8_t& ref = reinterpret_cast<uint8_t&>(ptr);

Вы бросаете указатель (void*) в качестве эталона. Это будет не результат в том же uint8_t, потому что он сделает ссылку на временный uint8_t, который вы создали из указателя пустоты. И поскольку создается новый uint8_t, вы получаете разные адреса.

Может быть, вы имели в виду uint8_t& ref = reinterpret_cast<uint8_t&>(stackVar);

+3

Возможно, он имел в виду reinterpret_cast (* ptr); – teivaz

+0

@teivaz Или это, конечно :) – Rakete1111

+0

Моя проблема была я не понимал, что если вы делаете 'reinterpret_cast (/ * thing here * /)' '' thing here' должен быть фактическим объектом, а не указателем. ... Спасибо, это очень помогло – DarthRubik