比较两个指针有什么限制?

时间:2017-08-29 15:09:30

标签: c pointers compiler-errors equals-operator relational-operators

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*/ 

为什么关系操作有错误/警告但比较操作没有?

2 个答案:

答案 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;
}

如果结构的数据成员xy之间没有填充,那么输出将等于1,因为每个数据成员都可以被视为一个数组成员元素和&#34;数组&#34; y紧跟在&#34;数组&#34; x

但是,您可能无法将指针与不指向同一数组或过去的元素的关系运算符(<><=>=)进行比较同一个数组的结尾。