【发布时间】:2018-07-26 11:06:39
【问题描述】:
假设我有以下代码:
Foo *foo = something();
uintptr_t bar = reinterpret_cast<uintptr_t>(foo);
bar是代表foo的地址还是foo指向的地址?我相信是foo的地址,但我想确定我没有弄错。
一些说明
What is uintptr_t data type 解释说
在 C99 中,它被定义为“无符号整数类型,其属性是任何指向 void 的有效指针都可以转换为该类型,然后再转换回指向 void 的指针,结果将与原始指针进行比较” .
但这并没有说明 什么 正在被存储。编译器能否将foo 指向的地址存储在bar 中,然后在从uintptr_t 转换回Foo 时构造一个具有不同地址的新指针?也许我误解了指针比较,但是由于它们指向同一个对象,它们不会比较相等吗?
我想我正在寻找一些关于是否添加以下行的迂腐解释:
Foo *foo2 = reinterpret_cast<Foo *>(bar);
这里到底发生了什么?未定义的行为? foo2 只是指向与foo 相同的对象?
【问题讨论】:
-
foo的地址是&foo,这是一个Foo**值。
标签: c++