想要了解有关警告的更多信息:C编程中指针和整数之间的比较

时间:2015-12-07 19:14:44

标签: c pointers null

下面是我遇到的一个小程序,并且考虑更多地搜索它。它给出warning: comparison between pointer and integer

 if ( NULL == '\1' )

我只是无法弄清楚哪一个是指针,哪一个是整数,更重要的是为什么呢?

我可以说NULL是指针,但不知道为什么会这样?

是的,当我们用NULL替换'\0'时,还有一件事就是没有编译警告。为什么呢?

完整的代码是: -

#include <stdio.h>
int main()
{
    if ( NULL == '\1' )
    {
       printf (" \nTrue "); 
    }
    else
    {
        printf (" \nFalse");
    }
    return 0;
}

4 个答案:

答案 0 :(得分:3)

NULL是一个空指针常量。它通常定义为:

#define NULL 0

#define NULL ((void *)0)

根据您收到的警告消息,看起来您的实现具有后一种定义。

因此,当您比较指针和int时,比较会生成警告消息。字符文字在C中的类型为int

  

是的,当我们用'\ 0'替换NULL时,还有一件事就是   没有编译警告。为什么呢?

这是因为将int'\0')与另一个int'\1')进行比较是正常的。

答案 1 :(得分:2)

嗯,你只能比较性质相当的东西。整数和地址太不同,无法比较;整数是值,而地址是指向值的指针,它们的用法太过不同,不能认为它们具有可比性。

NULL被定义为((void *)0),它是指针的特殊常量,表示从不指向某个东西的指针......它被键入为指针。 void *是指针的通用类型。

\1char的常量(它是ASCII表中索引1的字符,它被称为SOH char)。 char大致是一个数字,可以在打印时轻松转换为char。您的文字是1作为字符输入,但为了提高效率,在几乎所有算术和比较表达式中,每个此类字符都转换为int

所以你基本上比较了一个指向int的指针,正如编译器所说的那样。这不是严格禁止的,但编译器像往常一样严重怀疑并警告你。实际上,你的表达毫无意义。

如果你真的想比较两者(也许可能没有意义),那么你可以:

  1. 将指针转换为int(这很危险,因为你肯定会在转换中丢失信息):`((int)NULL)=='\ 1',
  2. 将文字值转换为指针(危险性较小但也很愚蠢):`NULL ==(void *)'\ 1'

答案 2 :(得分:1)

NULL0'\0'的含义略有不同。有关详细信息,请参阅hereNULL被指定为空指针,而0是整数 0 的常量字面值。您也可以使用整数 0 的常量文字作为指针。在这种情况下,Thay有一些特殊的意义。这意味着您可以在所有此类情况下使用0,但NULL仅应用于指针。如果你的整数不是0,那么将它与指针进行比较是没有意义的。请记住,在使用 C / C ++ 时,您不知道硬件上的指针是如何表示的。

在C NULL中通常实现为((void*)0)。在C ++中,它可以实现为0

如果在 C 中编写NULL == 0,则将整数与指针进行比较。由于0是整数 0 的常量字面值,因此它具有特殊含义,不会生成任何警告或错误。但是如果你有另一个整数,可能是1,那么将它与NULL进行比较没有多大意义。

答案 3 :(得分:0)

NULL与内存地址进行比较才真正有意义。 1显然不是一个有意义的内存地址,但0是一个常用的内存地址。如果您将NULL0以外的任何非指针值进行比较,则会高度暗示逻辑错误,这就是您收到警告的原因。

也许您正在考虑非官方但常见的宏NUL,其定义为'\0'