C标准保证该size_t
类型可以容纳任何数组索引。从逻辑上讲,这意味着size_t
应该能够容纳任何指针类型。我在Google上发现的一些网站上读到这是合法的,并且/或者应该一直有效:
void *v = malloc(10);
size_t s = (size_t) v;
因此,在C99中,该标准引入了intptr_t
和uintptr_t
类型,保证可以容纳指针的有符号和无符号类型:
uintptr_t p = (size_t) v;
那么使用size_t
和之间有什么区别uintptr_t
?两者都是无符号的,并且都应该能够容纳任何指针类型,因此它们在功能上似乎相同。除了清晰度之外,是否有任何真正令人信服的理由使用uintptr_t
(或更好的是void *
)而不是size_t
?在不透明的结构中,该字段仅由内部函数处理,是否有任何理由不这样做呢?
出于同样的原因,ptrdiff_t
它是一个有符号的类型,能够保存指针差异,因此能够保存大多数指针,那么它与intptr_t
有何区别?
所有这些类型难道不是都为同一个功能提供了完全不同的版本吗?如果没有,为什么?我不能对其中一个进行处理,而对另一个却不能进行处理?如果是这样,为什么C99在该语言中添加了两种本质上多余的类型?
我愿意忽略函数指针,因为它们不适用于当前问题,但是我可以随意提及它们,因为我有一个偷偷摸摸的怀疑,它们将是“正确”答案的核心。
size_t
和之间的区别,uintptr_t
但是ptrdiff_t
又和intptr_t
-两者都无法在几乎任何平台上存储相同范围的值吗?为什么要同时使用有符号和无符号指针大小的整数类型,特别是如果ptrdiff_t
已经达到有符号指针大小的整数类型的目的。