uintptr_t是否存储指针的地址或其值?

时间:2018-07-26 11:06:39

标签: c++

让我们说我有以下代码:

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中,然后在从Foo回退到uintptr_t时构造一个具有不同地址的新指针吗?也许我误解了指针比较,但是由于它们指向同一个对象,它们将不会相等吗?

我想我正在寻找有关是否添加以下行的简单知识:

Foo *foo2 = reinterpret_cast<Foo *>(bar);

这到底发生了什么?未定义的行为? foo2指向与foo相同的对象吗?

2 个答案:

答案 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本身的地址。