比较两个空指针

时间:2012-12-03 12:09:33

标签: c pointers null c99

  

C99 6.3.2.3/3整数常量表达式,其值为0或类似值   转换为void *类型的表达式称为空指针   constant.55)如果将空指针常量转换为指针   类型,保证结果指针,称为空指针   将不等与指向任何对象或函数的指针进行比较。

是否说两个空指针不相等?但他们这样做:

int *a = 0;
int *b = 0;

assert(a == b); // true

我想知道在这种情况下什么是不平等的?

2 个答案:

答案 0 :(得分:3)

您需要仔细阅读标准:空指针与任何指向对象函数的指针不相等。通过在对象上使用address-of运算符(例如&foo),无法生成空指针。任何函数指针都保证不为NULL。总之,这两个暗示空指针永远不会比较等于ptr到对象或ptr到函数。

澄清一下, 比较不平等 表示a == b为假(与a != b相同)。

您引用的段落没有说明比较两个空指针,但下一段确实如此:

将空指针转换为另一种指针类型会产生该类型的空指针。  任何两个空指针都应该相等。

比较平等 表示a == b为真(与a != b相同)为假。)

答案 1 :(得分:1)

如果在解释声明时出错,请纠正我。

int main() {
   void* a = (void *)0;
   int* b;    // pointer b is of different type to a
   printf((a == b) ? "equal" : "not equal");
   return 0;
}

结果:

not equal

声明,

If a null pointer constant is converted to a pointer type, the resulting pointer, called a null
pointer, is guaranteed to compare unequal to a pointer to any object or function.

说,两个指针可以比较相等,当且仅当它们都是空指针或同一个对象或函数的指针时,并且当你比较两个不同的指针类型时它们是不相等的。