这是我正在测试的代码:
int value = 0;
void* addyvoid = static_cast<void*>(&value); // C++-style cast.
它运行得非常完美,但我可以使用 uintptr_t
/ intptr_t
。但人们说它们不适合保存指针这里,因为它们太大了。那么,这是真的吗?如果是,使用 void*
保存指针会更好,但是否会丢失数据?
intptr_t
和uintptr_t
的目的是,在某些应用程序中,您实际上确实需要对指针值进行一些数字计算,可能通过翻转单个位,也可能通过XORing它们等。在这些情况下,当您需要使用指针的数字值时,intptr_t
和uintptr_t
是整数类型(如果存在)保证足够大以容纳任何指针。这对于int
来说并不是真的,因为int
的大小相对于指针大小没有指定。reinterpret_cast
将intptr_t
和uintptr_t
与指针类型进行转换。void*
。这种转换被保证可以工作,而从void*
转回原始类型只需要static_cast
,并且被保证是安全的。
intptr_t
和uintptr_t
的大小并不是避免使用它们的好理由。它们只是用于不同的应用程序。如果需要在指针上进行数字计算,请使用这些类型。否则,如果你只需要存储“指向某个东西的指针”,请使用void*
。
uintptr_t
/intptr_t
,而且不,它将保留所需数据。 - apple apple