想了解更多关于警告的信息:C编程中指针和整数的比较吗
下面是我遇到的一个小程序,我想在上面搜索更多。它给出了一个想了解更多关于警告的信息:C编程中指针和整数的比较吗,c,pointers,null,C,Pointers,Null,下面是我遇到的一个小程序,我想在上面搜索更多。它给出了一个警告:指针和整数之间的比较 if ( NULL == '\1' ) 我只是不知道哪一个是指针,哪一个是整数,更重要的是为什么 我可以说NULL是这里的指针,但不知道为什么 是的,当我们用'\0'替换NULL时,还有一件事是没有编译警告的。为什么? 完整代码为:- #include <stdio.h> int main() { if ( NULL == '\1' ) { printf (" \n
警告:指针和整数之间的比较
if ( NULL == '\1' )
我只是不知道哪一个是指针,哪一个是整数,更重要的是为什么
我可以说NULL是这里的指针,但不知道为什么
是的,当我们用'\0'
替换NULL
时,还有一件事是没有编译警告的。为什么?
完整代码为:-
#include <stdio.h>
int main()
{
if ( NULL == '\1' )
{
printf (" \nTrue ");
}
else
{
printf (" \nFalse");
}
return 0;
}
#包括
int main()
{
如果(NULL=='\1')
{
printf(“\nTrue”);
}
其他的
{
printf(“\n假”);
}
返回0;
}
NULL
是一个空指针常量。它通常被定义为:
#define NULL 0
或
根据您收到的警告消息,您的实现似乎具有后一种定义
因此,在比较指针和int
时,比较会产生警告消息。字符文字的类型为C中的int
是的,当我们用'\0'替换空值时,还有一件事
没有编译警告。为什么?
这是因为将一个
int
('\0'
)与另一个int
('\1'
)进行比较很好。只有将NULL
与内存地址进行比较才有意义<代码>1显然不是一个有意义的内存地址,但0
是一个常用的内存地址。如果将NULL
与0
以外的任何非指针值进行比较,则很可能是逻辑错误,这就是为什么会收到警告的原因
也许你想到的是非官方但通用的宏
NUL
,它被定义为'\0'
那么你只能比较本质上具有可比性的事物。整数和地址差异太大,无法进行比较;整数是值,而地址是指向值的指针,它们的用法太不同了,不能考虑它们是可比的。
NULL
定义为((void*)0)
,这是指针的一个特殊常量,表示从不指向某物的指针。。。它被键入为指针void*
是指针的通用类型
\1
是char
的常量(它是ASCII表中索引1的字符,称为SOH char)。字符大致是一个数字,在打印时可以轻松转换为字符。您的literal类型为字符,但为了提高效率,在几乎所有的算术和比较表达式中,每个这样的字符都转换为int
就像编译器所说的,基本上比较一个指针和一个int。这并不是严格禁止的,但是编译器像往常一样对此有严重的怀疑并警告您。实际上,你的表达毫无意义
如果您真的想比较两者(同样可能是无意义的),那么您可以:
NULL
、0
和'\0'
的含义稍有不同。有关更多信息,请参阅NULL
被设计为NULL指针,而0
是整数0的常量文本。指针也可以使用整数0的常量文本。在这种情况下它们有一些特殊的意义。这意味着您可以在所有此类情况下使用0
,但NULL
应仅用于指针。如果您的整数不是0,那么将其与指针进行比较就没有多大意义。请记住,在使用C/C++时,您不知道指针在硬件上是如何表示的
在C语言中,NULL通常被实现为((void*)0)
。在C++中,它可以被实现为<代码> 0 < /C> > < /P>
如果在C中写入
NULL==0
,则将整数与指针进行比较。由于0
是整数0的常量,因此它具有特殊含义,不会生成任何警告或错误。但是,如果你还有另一个整数,也许<代码> 1 <代码>,那么将它与#define NULL ((void *)0)