zoukankan      html  css  js  c++  java
  • c中NULL,'\0'和0之间的区别. (the difference between NULL,'\0' and 0 in c)

    1.空指针. 

    整数0常量在不同的情况下可能有不同的含义,这取决于使用它的上下文。在所有的情况下,它仍然是一个常数,也就是为0的整数,只是经不同的方式描述而已。如果拿一个指针和常量0进行比较,那么这是一个检查指针是否是空指针。这时0代表是一个空指针常量。在标准C定义中:0 可转型为 void*类型,这时 0是一个空指针或一个空指针常量。

    此外,为了提高程序的可读性,NULL宏在stddef.h文件中定义了.但是你的编译器可能会使用#undef NULL, 并将NULL定义成了其它奇怪的东西了,但是这种情况是永远不可能出现的.

    下面有三种检查空指针的方式:

    if (pointer == NULL)
    //NULL的定义被用来比较空指针.
    if (pointer == 0)
    //0是空指针针的另外一种表殃形式.
    if (!pointer)
    //这个其实是隐含的检查是否为0

    关于第三个Bool类型的判断,可以参考: BOOL类型的判断

    非法的判断方式下面所示:

    int mynull = 0;
    <some code>
    if (pointer == mynull)

    这个对编译器来说,不是判断是否是空指针了,而是比较两个变量是否相等.在mynuul的值从来没有改变过的情况下,是可以的,但是如果变了,那就会造成意想不到的结果了.

    需要注意的是:什么是C中的空指针.空指针和底层的框架无关,如底层将空指针定义成了地址为:0xDEADBEEF,但是我们没有必要关心这个,编译器会为我们处量这个事情的.所以即使在这种可笑的架构中,我们在上面所说的三种判断空指针的方式仍然是正确的.

    但下面这些检查空指针的方式就是非法的:

    #define MYNULL (void*)0xDEADBEEF
    if(pointer == MYNULL)
    if(pointer ==0xDEADBEEF)

    2.空字符串.

    '\0'被定义为空字符,因为他是一个字符所有的位都被设为0了.这和指针没有任何的关系.你可能会看到和下面相似的代码.

    if (!*string_pointer)
    if (*string_pointer)

     这两种方式分别是用来判断指针是否是指向空字符的.这不要和空指针搞混了.正因为bit表示是一样的,并且可能会在有些情况下会交叉使用,但是实际上他们是并不相同的.

    需要注意的是: '\0'最多的是用来表示字符串的结尾.

    此外:

    '\0'(和所有的字符)都是整形常量.他和0是相等的.所以'\0'是整形的0是相等的.唯一的不同就是他传达给读者的意图(我在使用一个空字符).

  • 相关阅读:
    2020牛客寒假算法基础集训营5 F 碎碎念
    性能测试过程中oracle数据库报ORA-27301 ORA-27302错
    Linux裸设备管理详解--
    GoldenGate 之 Bounded Recovery说明
    关于Oracle GoldenGate中Extract的checkpoint的理解 转载
    SMON: Parallel transaction recovery tried 引发的问题--转载
    用直接路径(direct-path)insert提升性能的两种方法
    深入理解Oracle的并行操作-转载
    oracle大表添加字段default经验分享
    Oracle Hang分析--转载
  • 原文地址:https://www.cnblogs.com/algorithmic/p/2704904.html
Copyright © 2011-2022 走看看