zoukankan      html  css  js  c++  java
  • C/C++语言中NULL、'’和0的区别

     注:本文参考了http://blog.csdn.net/mylinx/article/details/6873253及书籍《征服C指针》([日]前桥和弥著)。

        NULL、''和0的值是一样的,都是0,不过它们的表现形式不一样:

        1. NULL: 即空指针,不过在C和C++中并不一样。在VS 2013的库文件string.h中可以看到如果定义。

    复制代码
    1 /* Define NULL pointer value */
    2 #ifndef NULL
    3 #ifdef __cplusplus
    4 #define NULL    0
    5 #else  /* __cplusplus */
    6 #define NULL    ((void *)0)
    7 #endif  /* __cplusplus */
    8 #endif  /* NULL */
    复制代码

        可以看出,在C中,NULL表示的是指向0的指针,而在C++中,NULL就直接跟0一样了。但有一点值得注意的是:在C语言中,“当常量0处于应该作为指针使用的上下文中时,它就作为空指针使用”(《征服C指针》)。例如,下边的指针定义和初始化是没问题的(即没警告也没报错):

     int * p = 0;    /* C language */

         但如果定义成如下的样子呢?

     int * p = 3;    /* C language */

      很明显,这样子做是有问题的。这一句可以编译通过,但在VS 2013中有这样的警告:“warning C4047: “初始化”:“int *”与“int”的间接级别不同”。

      我又试了一下这一句在C++中的情况,VS 2013就直接报错了:“ ‘int’ 类型的值不能用于初始化 ‘int *’ 类型的实体”。

      因此,为了防止混淆,在C/C++中,当要将一个指针赋值为空指针的时候,都应该将它赋为NULL,而不是0。

      

      2. ‘’:‘’是一个“空字符”常量,它表示一个字符串的结束,它的ASCII码值为0。注意它与空格' '(ASCII码值为32)及'0'(ASCII码值为48)不一样的。

      在《征服C指针》中,作者还提到了一种错误的程序写法:使用NULL来结束字符串。例如下边的程序就是有问题的:

    char str[4] = { '1', '2', '3', NULL };    /* C language */

      在VS 2013中,会的这样的警告:“warning C4047: “初始化”:“char”与“void *”的间接级别不同”。而在C++中,这一句是没有问题的。

      还有一点值得注意,如下的程序在C/C++中都是没有问题的:

    char str[4] = { '1', '2', '3', 0 };    / C/C++ language */

      但为了防止混淆,在C/C++中,当要给一个字符串添加结束标志时,都应该用‘’而不是NULL或0。

      综上所述,当我们要置一个指针为空时,应该用NULL,当我们要给一个字符串添加结束标志时,应该用‘’。

  • 相关阅读:
    10 个深恶痛绝的 Java 异常。。
    为什么公司宁愿 25K 重新招人,也不给你加到 20K?原因太现实……
    推荐一款代码神器,代码量至少省一半!
    Spring Cloud Greenwich 正式发布,Hystrix 即将寿终正寝。。
    hdu 3853 LOOPS(概率 dp 期望)
    hdu 5245 Joyful(期望的计算,好题)
    hdu 4336 Card Collector(期望 dp 状态压缩)
    hdu 4405 Aeroplane chess(概率+dp)
    hdu 5036 Explosion(概率期望+bitset)
    hdu 5033 Building (单调栈 或 暴力枚举 )
  • 原文地址:https://www.cnblogs.com/socrates-lzstu/p/5397215.html
Copyright © 2011-2022 走看看