intptr_t 是比 void * 更好的选择吗

C/C++ 2018-04-16

intptr_t 是何方神圣

相信大多数程序员对 intptr_t 比较陌生的,也不要认为是 int 类型的指针。其实这个和 int 没什么关系,也不知道定标准的人是怎么想的= =

intptr_t 是C语言标准委员会 C99 标准中新加的类型, 它占用的空间始终与平台上地址位数相同,因此用来存放地址。

指针传值的 int -> void* -> int 就有了新的方式 int -> intptr_t -> int

但是现在更常用的其实是 void* -> intptr_t -> void*

能取代 void * 吗

不见得。尽管 intptr_t 提出能更好的区别类型。然而它却有以下几个缺陷:

  1. 需要 C99 标准,在旧的平台或编译器并不支持 intptr_t 类型;
  2. intptr_t 可能丢失信息,因为 intptr_t 类型的大小与平台的地址位数相等,因此无法保证 intptr_t > int
  3. 系统API仍然使用 void* 作为参数。这也是因为 void* 能代表任意数据带来的便利性。例如在 POSIX 的接口 pthread_create() 中,用的就是 void* 来作为参数传递。

intptr_t 就没有什么好处吗?

有的有的有的,它的语义更加明确,老子就是用来存放地址的,不要给老子放啥 int 。放也可以需要转一下 int -> int* ->intptr_t -> int* -> int 。而 void* 范围太广,容易造成滥用和后期维护成本。因此在程序中,明确是传递地址的情况下用 intptr_t 更加合理,代码可读性也比较高。


本文由 hongweipeng 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

如果对您有用,您的支持将鼓励我继续创作!