本文迁移自博客园。
NULL、’\0’ 和 0 的值是一样的,都是 0,不过它们的表现形式不一样。
NULL
NULL 即空指针,不过在 C 和 C++ 中并不一样。在 VS 2013 的库文件 string.h 中可以看到如下定义:
1 | /* Define NULL pointer value */ |
可以看出,在 C 中,NULL 表示的是指向地址为 0 的指针,而在 C++ 中,NULL 就直接跟 0 一样了。
但有一点值得注意的是:在 C 语言中,“当常量 0 处于应该作为指针使用的上下文中时,它就作为空指针使用”(《征服 C 指针》)
。例如,下边的指针定义和初始化是没问题的(即没警告也没报错):
1 | int * p = 0; /* C language */ |
但如果定义成如下的样子呢?
1 | int * p = 3; /* C language */ |
很明显,这样子做是有问题的。这一句可以编译通过,但在 VS 2013 中有这样的警告:“warning C4047: ‘初始化’:‘int *’ 与 ‘int’ 的间接级别不同”。
我又试了一下这一句在 C++ 中的情况,VS 2013就直接报错了:“ ‘int’ 类型的值不能用于初始化 ‘int *’ 类型的实体”。
因此,为了防止混淆,在 C/C++ 中,当要将一个指针赋值为空指针的时候,都应该将它赋为 NULL,而不是 0。
注:在 C++11 之后,空指针可以用 nullptr
关键字来表示,这样意义更具体。
\0
\0
是一个“空字符”常量,它表示一个字符串的结束,它的 ASCII 码值为 0。注意它与空格’ ‘(ASCII 码值为 32)及 ‘0’(ASCII 码值为 48)是不一样的。
在《征服 C 指针》中,作者还提到了一种错误的程序写法:使用NULL来结束字符串。例如下边的程序就是有问题的:
1 | char str[4] = { '1', '2', '3', NULL }; /* C language */ |
在 VS 2013 中,会的这样的警告:“warning C4047: ‘初始化’:‘char’与‘void *’的间接级别不同”。而在 C++ 中,这一句是没有问题的。
还有一点值得注意,如下的程序在 C/C++ 中都是没有问题的:
1 | char str[4] = { '1', '2', '3', 0 }; / C/C++ language */ |
但为了防止混淆,在C/C++中,当要给一个字符串添加结束标志时,都应该用 '\0' 而不是 NULL 或 0。
综上所述,当我们要置一个指针为空时,应该用 NULL,当我们要给一个字符串添加结束标志时,应该用 '\0'。