下面是我遇到的一个小程序,并且考虑更多地搜索它。它给出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;
}
答案 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 *
是指针的通用类型。
\1
是char
的常量(它是ASCII表中索引1的字符,它被称为SOH char)。 char大致是一个数字,可以在打印时轻松转换为char。您的文字是1作为字符输入,但为了提高效率,在几乎所有算术和比较表达式中,每个此类字符都转换为int
。
所以你基本上比较了一个指向int的指针,正如编译器所说的那样。这不是严格禁止的,但编译器像往常一样严重怀疑并警告你。实际上,你的表达毫无意义。
如果你真的想比较两者(也许可能没有意义),那么你可以:
答案 2 :(得分:1)
NULL
,0
和'\0'
的含义略有不同。有关详细信息,请参阅here。 NULL
被指定为空指针,而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
是一个常用的内存地址。如果您将NULL
与0
以外的任何非指针值进行比较,则会高度暗示逻辑错误,这就是您收到警告的原因。
也许您正在考虑非官方但常见的宏NUL
,其定义为'\0'
。