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*/
为什么关系操作有错误/警告但比较操作没有?
答案 0 :(得分:3)
您只能对来自同一阵列或相同聚合的指针执行关系操作(<
,>
,<=
,>=
)宾语。否则,它会导致undefined behavior。
引用C11
,章节§6.5.8,关系运算符,第5段
当比较两个指针时,结果取决于中的相对位置 指向的对象的地址空间。如果两个指向对象类型的指针都指向 相同的对象,或两者都指向同一个数组对象的最后一个元素,它们 比较平等。如果指向的对象是同一聚合对象的成员, 稍后声明的结构成员的指针比指向成员的指针要大 在结构中先前声明,并指向具有较大下标的数组元素 值比具有较低下标值的同一数组的元素的指针大。指向同一个union对象的成员的所有指针都比较相等。如果 expression
P
指向数组对象的元素,表达式Q
指向 同一个数组对象的最后一个元素,指针表达式Q+1
比较大于P
。 在所有其他情况下,行为未定义。
在您的代码中,
if(p1>p2)
是尝试比较不属于同一数组对象的两个指针,也不是同一聚合对象的成员。因此,它会触发警告。
但是,为了进行比较,没有这样的约束,所以像(ip1==ip2)
这样的表达式就完全可以了。
答案 1 :(得分:1)
您可以将指针与指向不同对象或不同数组元素的相等运算符(==
或!=
)进行比较。如果指针没有指向同一个对象,那么它们将被视为不相等。
更确切地说(C标准,6.5.9平等运营商)
6当且仅当两者都是空指针时,两个指针比较相等, 两者都是指向同一对象的指针(包括指向对象的指针) 以及它的开头的一个子对象)或函数,都是指针 一个超过同一个数组对象的最后一个元素,或者一个是a 指向一个数组对象末尾的指针,另一个指向 指向恰好发生的另一个数组对象的开始的指针 紧跟地址空间中的第一个数组对象。
请考虑以下示例。
#include <stdio.h>
int main(void)
{
struct A
{
int x;
int y;
} a;
printf( "&a.x + 1 == &a.y is %d\n", &a.x + 1 == &a.y );
return 0;
}
如果结构的数据成员x
和y
之间没有填充,那么输出将等于1
,因为每个数据成员都可以被视为一个数组成员元素和&#34;数组&#34; y
紧跟在&#34;数组&#34; x
。
但是,您可能无法将指针与不指向同一数组或过去的元素的关系运算符(<
,>
,<=
,>=
)进行比较同一个数组的结尾。