了解void *对intptr_t和uintptr_t

时间:2016-12-02 22:28:59

标签: c++ pointers casting integer

这是我测试的代码:

int value = 0;
void* addyvoid = static_cast<void*>(&value); // C++-style cast.

效果很好,但我可以使用uintptr_t / intptr_t。但是,正如人们所说here因为它们太大,它们并不适合保留指针。那么,这是真的吗?但是,如果是,使用void*保留指针会更好,但会丢失数据吗?

1 个答案:

答案 0 :(得分:9)

intptr_tuintptr_t的目的是在某些应用程序中,您实际上需要对指针值进行某种数值计算,可能是通过翻转单个位,可能是{{3}在这些情况下,当您需要使用指针的 numeric 值时,intptr_tuintptr_t是整数类型(如果它们存在)是保证足够大以容纳任何指针。例如,int并非如此,因为未指定int相对于指针大小的大小。

因为进行这些转换从根本上说是不安全的,所以C ++要求您使用reinterpret_cast来转换intptr_tuintptr_t以及指针类型。

如果你正在做的就是存储“指向某个东西的指针”,并且只要指针不是函数指针或成员函数指针,你就可以将其强制转换为void*。该演员阵容保证有效,从void*转换回原始类型只需要static_cast,并且保证安全。

intptr_tuintptr_t的大小并不是避免它们的好理由。它们仅适用于不同的应用。如果需要对指针进行数值计算,请使用这些类型。否则,如果您只需要存储“指向某个内容的指针”,请使用void*