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,当我们要给一个字符串添加结束标志时,应该用‘’。

  • 相关阅读:
    POJ 1320 Street Numbers 解佩尔方程
    数学分支(转)
    深入理解Java类加载器(1):Java类加载原理解析
    Java类加载器的工作原理
    深入理解Java:类加载机制及反射
    类加载机制:全盘负责和双亲委托
    java底层学习
    代码面试最常用的10大算法
    程序员面试金典算法题
    了解ASCII、gb系列、Unicode、UTF-8的区别
  • 原文地址:https://www.cnblogs.com/xiehongfeng100/p/4010802.html
Copyright © 2011-2022 走看看