【问题标题】:Printing addresses of variables打印变量地址
【发布时间】:2016-05-15 01:28:43
【问题描述】:

当我运行这段代码时:

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

至少在我的估计中,我应该为所有这三个陈述得到相同的数字。这是怎么回事?

【问题讨论】:

  • 你在猜测引用是如何实现的
  • &amp;ref 是指针引用的地址。为什么你会期望它等于指针本身?
  • 我认为 OP 很困惑 &amp; 有两个含义。第一个 cout 中的 &amp; 表示 address-of,而不是 reference

标签: c++ pointers reference memory-address


【解决方案1】:

uint8_t&amp; ref = reinterpret_cast&lt;uint8_t&amp;&gt;(ptr);

您正在将指针 (void*) 投射到引用。这将不会产生相同的uint8_t,因为它会引用一个临时的uint8_t,它是由一个空指针创建的。而且因为创建了一个新的uint8_t,所以你会得到不同的地址。

也许你的意思是uint8_t&amp; ref = reinterpret_cast&lt;uint8_t&amp;&gt;(stackVar);

【讨论】:

  • 可能他的意思是 reinterpret_cast(*ptr);
  • @teivaz 或者那个,当然:)
  • 我的问题是我没有意识到如果你做一个reinterpret_cast&lt;sometype&amp;&gt;(/*thing here*/) thing here 必须是一个实际的对象而不是一个指针.....谢谢这极大的帮助
  • @DarthRubik 它也可以是一个指针,但是你必须将它分配给一个指针,而不是一个对象
  • @teivaz(虽然你不能*ptr,因为ptrvoid*,但我明白了)
猜你喜欢
  • 2016-07-06
  • 1970-01-01
  • 2016-10-10
  • 1970-01-01
  • 1970-01-01
  • 2016-01-23
  • 2021-03-01
  • 2013-04-30
  • 2023-02-07
相关资源
最近更新 更多