[原创] C标准中关于 指针比较 的规定
观某帖有感,感叹这些基础知识竟然好多人不懂,因此特意翻译一下,有错的话,请指正When two pointers are compared, the result depends on the relative locations in the address space of the objects pointed to.
两个指针相比较,结果取决于所指对象的地址的相对位置。
(这没什么好说的)
If two pointers to object types both point to the same object, or both point one past the last element of the same array object, they compare equal.
如果两个指针指向同一个对象,或指向同一个数组的最后一个元素的下一个元素时,它们相等。
(举例,int arr[2];
那么 &arr[0]和&arr[0]相等、&arr[1]和&arr[1]相等、&arr[2]和&arr[2]相等,虽然arr[2]不存在,但其地址是有效的;
而 &arr[3]和&arr[3]相比较呢?属于 未定义行为。
)
If the objects pointed to are members of the same aggregate object, pointers to structure members declared later compare greater than pointers to members declared earlier in the structure,
如果两个指针指向同一个聚合体(struct和array)的成员,那么声明在后的成员地址 大于 声明在前的成员地址
(举例,struct foo{ double a; int b; }; 中 &b 大于 &a。
如果不是同一个聚合体呢?属于 未定义行为。
)
and pointers to array elements with larger subscript values compare greater than pointers to elements of the same array with lower subscript values.
同一个数组中,下标大的元素的地址 大于 下标小的元素的地址
(举例,int arr[2] 中 &arr[2] > &arr[1] > &arr[0]
如果不是同一个数组呢?属于 未定义行为。
)
All pointers to members of the same union object compare equal.
同一个union对象中,成员地址都相同
If the expression P points to an element of an array object and the expression Q points to the last element of the same array object, the pointer expression Q+1 compares greater than P.
P指向某数组中的某个元素,Q指向这个数组中的最后一个元素,那么Q+1大于P。
(之前已经举例过了,对于 int arr[2],则 &arr[0]、&arr[1] 都小于 &arr[2])
In all other cases, the behavior is undefined.
其它的所有情况,其行为都是未定义的。
-------------------------------------------------------------------
对于C++而言,还规定在同一个class/struct中的访问控制权限(public,protected,private)必须一样。
-------------------------------------------------------------------
指针相减的类型是 ptrdiff_t,输出格式是 %t,举例
#include <stdio.h>
int main( void )
{
int arr[2];
ptrdiff_t d = &arr[2] - &arr[0];
printf( "%td\n", d );
}
[此贴子已经被作者于2016-8-9 19:42编辑过]