让我们说我有以下代码:
Foo *foo = something();
uintptr_t bar = reinterpret_cast<uintptr_t>(foo);
bar
代表foo
的地址还是foo
指向的地址?我相信这是foo
的地址,但我想确定自己没有记错。
一些说明
在C99中,它被定义为“无符号整数类型,其属性是可以将任何有效的指向void的指针转换为该类型,然后再转换回指向void的指针,结果将与原始指针进行比较”
但这并没有说明正在存储什么。可以想象,编译器可以将foo
指向的地址存储在bar
中,然后在从Foo
回退到uintptr_t
时构造一个具有不同地址的新指针吗?也许我误解了指针比较,但是由于它们指向同一个对象,它们将不会相等吗?
我想我正在寻找有关是否添加以下行的简单知识:
Foo *foo2 = reinterpret_cast<Foo *>(bar);
这到底发生了什么?未定义的行为? foo2
指向与foo
相同的对象吗?
答案 0 :(得分:3)
这取决于应用强制转换的对象。
在uintptr_t bar = (uintptr_t)foo;
中,它的值foo
(指向对象的地址)存储在bar
中。
更喜欢使用C ++强制转换,它们可以将更多信息传达给读者,并且在维护过程中更强大-最佳实践:
uintptr_t bar = reinterpret_cast<uintptr_t>(foo);
答案 1 :(得分:2)
这是一个整数值,代表foo
指向的地址。
如果您将其编写为
uintptr_t bar = (uintptr_t)(&foo);
然后它将是foo
本身的地址。