这是我测试的代码:
int value = 0;
void* addyvoid = static_cast<void*>(&value); // C++-style cast.
效果很好,但我可以使用uintptr_t
/ intptr_t
。但是,正如人们所说here因为它们太大,它们并不适合保留指针。那么,这是真的吗?但是,如果是,使用void*
保留指针会更好,但会丢失数据吗?
答案 0 :(得分:9)
intptr_t
和uintptr_t
的目的是在某些应用程序中,您实际上需要对指针值进行某种数值计算,可能是通过翻转单个位,可能是{{3}在这些情况下,当您需要使用指针的 numeric 值时,intptr_t
和uintptr_t
是整数类型(如果它们存在)是保证足够大以容纳任何指针。例如,int
并非如此,因为未指定int
相对于指针大小的大小。
因为进行这些转换从根本上说是不安全的,所以C ++要求您使用reinterpret_cast
来转换intptr_t
和uintptr_t
以及指针类型。
如果你正在做的就是存储“指向某个东西的指针”,并且只要指针不是函数指针或成员函数指针,你就可以将其强制转换为void*
。该演员阵容保证有效,从void*
转换回原始类型只需要static_cast
,并且保证安全。
intptr_t
和uintptr_t
的大小并不是避免它们的好理由。它们仅适用于不同的应用。如果需要对指针进行数值计算,请使用这些类型。否则,如果您只需要存储“指向某个内容的指针”,请使用void*
。