C-比较两个指针的限制是什么?


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

但是,您不得将指示器与关系运算符(<><=>=)进行比较,而不会指向同一数组的元素或同一数组的末端。

相关内容

  • 没有找到相关文章

最新更新