理解void*与intptr_t、uintptr_t的区别

15

这是我正在测试的代码:

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

它运行得非常完美,但我可以使用 uintptr_t / intptr_t。但人们说它们不适合保存指针这里,因为它们太大了。那么,这是真的吗?如果是,使用 void* 保存指针会更好,但是否会丢失数据?


除非您将其更改为“reinterpret_cast”,否则不能使用uintptr_t / intptr_t,而且不,它将保留所需数据。 - apple apple
1个回答

26
intptr_tuintptr_t的目的是,在某些应用程序中,您实际上确实需要对指针值进行一些数字计算,可能通过翻转单个位,也可能通过XORing它们等。在这些情况下,当您需要使用指针的数字值时,intptr_tuintptr_t是整数类型(如果存在)保证足够大以容纳任何指针。这对于int来说并不是真的,因为int的大小相对于指针大小没有指定。
由于这些转换基本上是不安全的,C++要求您使用reinterpret_castintptr_tuintptr_t与指针类型进行转换。
如果你只是存储“指向某个东西的指针”,并且该指针不是函数指针或成员函数指针,那么你可以将其转换为void*。这种转换被保证可以工作,而从void*转回原始类型只需要static_cast,并且被保证是安全的。 intptr_tuintptr_t的大小并不是避免使用它们的好理由。它们只是用于不同的应用程序。如果需要在指针上进行数字计算,请使用这些类型。否则,如果你只需要存储“指向某个东西的指针”,请使用void*

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接