C 标准保证这size_t
是一种可以保存任何数组索引的类型。这意味着,从逻辑上讲,size_t
应该能够保存任何指针类型。我在谷歌上发现的一些网站上读到这是合法的和/或应该总是有效的:
void *v = malloc(10);
size_t s = (size_t) v;
所以在 C99 中,标准引入了intptr_t
anduintptr_t
类型,它们是有符号和无符号类型,保证能够保存指针:
uintptr_t p = (size_t) v;
size_t
那么使用和 和有什么区别uintptr_t
?两者都是无符号的,并且都应该能够保存任何指针类型,因此它们在功能上看起来是相同的。除了清晰之外,是否有任何真正令人信服的理由使用uintptr_t
(或者更好的是 a void *
)而不是 a size_t
?在不透明的结构中,字段将仅由内部函数处理,有什么理由不这样做吗?
出于同样的原因,ptrdiff_t
一直是一个有符号类型能够保存指针差异,因此能够保存大多数任何指针,那么它与 有何不同intptr_t
?
不是所有这些类型基本上都服务于相同功能的微不足道的不同版本吗?如果不是,为什么?我不能用其中一个做什么而我不能用另一个做什么?如果是这样,为什么 C99 会在语言中添加两种本质上是多余的类型?
我愿意忽略函数指针,因为它们不适用于当前的问题,但请随意提及它们,因为我偷偷怀疑它们将成为“正确”答案的核心。