size_t与uintptr_t
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在该语言中添加了两种本质上多余的类型? 我愿意忽略函数指针,因为它们不适用于当前问题,但是我可以随意提及它们,因为我有一个偷偷摸摸的怀疑,它们将是“正确”答案的核心。