intptr_t 有什么用?

新手上路,请多包涵

我知道它是一个整数类型,可以在不丢失数据的情况下转换为指针/从指针转换,但我为什么要这样做呢?与 void* 用于保存指针和 THE_REAL_TYPE* 用于指针运算相比,整数类型有什么优势?

编辑

标记为“已经被问到”的问题没有回答这个问题。问题是如果使用 intptr_t 作为 void* 的一般替代品是个好主意,而且那里的答案似乎是“不要使用 intptr_t”,所以我的问题仍然是有效: intptr_t 的一个好的用例是什么?

原文由 Baruch 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

主要原因是,您不能对 void * 执行按位运算,但您可以对 intptr_t 执行相同操作。

在许多情况下,您需要对地址执行按位运算,您可以使用 intptr_t

但是,对于按位运算,最好的方法是使用 unsigned 对应的 uintptr_t

正如 @chux另一个答案 中提到的,指针比较是另一个重要方面。

此外,FWIW,根据 C11 标准,§7.20.1.4,

这些类型是可选的。

原文由 Sourav Ghosh 发布,翻译遵循 CC BY-SA 3.0 许可协议

还有一个语义上的考虑。

A void* 应该 _指向某事_。尽管具有现代实用性,但指针不是内存地址。好的,它通常/可能/总是(!)持有一个,但它不是一个数字。这是一个指针。它指的是一个东西。

A intptr_t 没有。它是一个整数值,可以安全地转换为指针/从指针转换,因此您可以将它用于古董 API,将其打包成 pthread 函数参数,诸如此类。

这就是为什么您可以在 intptr_t 上比在 void* 上做更多的事情,以及为什么您应该通过为工作使用正确的类型来进行自我记录。

最终,几乎所有内容都 可以 是整数(请记住,您的计算机可以处理数字!)。指针可能是整数。但他们不是。它们是指针,因为它们用于不同的用途。而且,从理论上讲,它们可能不是数字。

原文由 Lightness Races in Orbit 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题