想了解更多关于警告的信息: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。这并不是严格禁止的,但是编译器像往常一样对此有严重的怀疑并警告您。实际上,你的表达毫无意义

如果您真的想比较两者(同样可能是无意义的),那么您可以:

  • 将指针转换为int(这很危险,因为在转换过程中肯定会丢失信息):`((int)NULL)=='\1'
  • 将文本值转换为指针(不太危险但也很愚蠢):`NULL==(void*)'\1'

  • 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 <代码>,那么将它与Nult .< /P>在C中进行比较,没有意义,通常定义为:“空定义空((空*)0)”,这与C++定义不同。所以,在C中,NULL是一个指针。谢谢,在C++中NULL不是指针,还是它?在C++中,取决于C++的版本,它是0L或nulpPTr.FALSE。在C++中(NUTE上的标签)NULL不能定义为<代码>(空洞*)0 < /代码>对不起,我没有注意到C++标签(我遵循C标签)。此外,代码看起来像C代码,标题C。也许,C++标签需要去。同意,其中一个放错了地方,但我不知道哪个:)这个问题只是为了获得更多关于NULL和‘0’的信息,而不是为了创建任何愚蠢的。对不起,如果愚蠢是一个错误的词,我不是英语母语,我可能会犯一些错误;如果是这样,请原谅我。
    #define NULL ((void *)0)