2016-05-14 8 views
1

Wenn ich diesen Code ausführen:Druck Adressen von Variablen

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; 

ich diese Ausgabe erhalten:

0x22fe30 
0x22fe3f 
0x22fe3f 

Zumindest in meiner Einschätzung sollte ich die gleiche Nummer für alle drei dieser Aussagen erhalten. Was geht hier vor sich?

+2

Sie machen Vermutungen darüber, wie Referenzen –

+0

'& ref' ist die Adresse eines Verweises auf einen Zeiger umgesetzt werden. Warum sollten Sie erwarten, dass dies dem Zeiger selbst entspricht? –

+0

Ich denke, das OP ist verwirrt, in dem & hat zwei Bedeutungen. Das '&' im ersten Cout bedeutet 'Address-Of', nicht 'Reference'. – PaulMcKenzie

Antwort

2

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

Sie werfen einen Zeiger (void*) zu einer Referenz. Dies wird nicht Ergebnis in der gleichen uint8_t, weil es einen Verweis auf eine temporäre uint8_t, die Sie aus einem leeren Zeiger erstellt haben. Und weil eine neue uint8_t erstellt wird, erhalten Sie unterschiedliche Adressen.

Vielleicht bedeutete Sie uint8_t& ref = reinterpret_cast<uint8_t&>(stackVar);

+3

Wahrscheinlich meinte er reinterpret_cast (* ptr); – teivaz

+0

@Teivaz Oder das, sicher :) – Rakete1111

+0

Mein Problem war, dass ich nicht erkannte, dass, wenn Sie eine 'reinterpret_cast (/ * Sache hier * /) tun' das 'Ding hier' muss ein tatsächliches Objekt kein Zeiger sein .. ... Danke, das hat immens geholfen – DarthRubik