int a=40,b=34;
int *iptr1,*iptr2;
iptr1 = &a;
iptr2 = &b;
printf("n Equal condition of two pointers=%d", (ip1 == ip2)); //no error
char name1[20], name2[20];
char *p1 = name1;
char *p2 = name2;
if(p1 > p2) /*Error*/
为什么关系操作有错误/警告,而没有用于比较操作?
您只能在同一数组或同一聚合对象的指针上执行关系操作(<
,>
,<=
,>=
)。否则,它会导致不确定的行为。
引用C11
,第§6.5.8章,关系运算符,第5段
比较两个指针时,结果取决于 地址指向物体的空间。如果两个指向对象类型的指示都指向 相同的对象,或两个都超过同一数组对象的最后一个元素,它们 比较相等。如果对象指的是同一聚合对象的成员, 指针构造成员以后宣布的比较比成员更大的指针 在结构早期声明,并指向具有较大下标的数组元素 值将比指针与具有较低下标值的同一数组的元素进行比较。所有指向同一联合对象成员的指针都相等。如果是 表达式
P
指向数组对象的元素,而表达式Q
指向 同一数组对象的最后一个元素,指针表达式Q+1
比较大于P
。在所有其他情况下,行为都是未定义的。
在您的代码中,
if(p1>p2)
是试图比较两个不属于同一数组对象的指针,也不是同一聚合对象的成员。因此,它触发了警告。
但是,为了进行比较,没有这样的约束,因此(ip1==ip2)
之类的表达式是完全可以的。
您可以将指示器与相等性运算符(==
或!=
)进行比较,以指向不同数组的不同对象或元素。如果指针没有指向相同的对象,则将它们视为不等式。
更精确(C标准,6.5.9平等运算符)
6两个指针比较时,只有当两个指针都是无效的指针时, 两者都是指向同一对象的指针(包括指向对象的指针 以及一个从开始时)或功能,都是指的指示 一个超过同一数组对象的最后一个元素,或一个是一个 指向一个阵列对象的一个末端,另一个是一个 指向发生的不同数组对象的开始 立即按地址空间中的第一个数组对象。
考虑以下示例。
#include <stdio.h>
int main(void)
{
struct A
{
int x;
int y;
} a;
printf( "&a.x + 1 == &a.y is %dn", &a.x + 1 == &a.y );
return 0;
}
如果数据成员x
和结构的y
之间没有填充,则输出将等于1
,因为每个数据成员都可以视为具有一个元素的数组,而"阵列" y
立即遵循"阵列"阵列。" x
。
但是,您不得将指示器与关系运算符(<
,>
,<=
,>=
)进行比较,而不会指向同一数组的元素或同一数组的末端。