NULL,0,\0,'0'的区别

我们在学习过程中经常遇到NULL,0,\0,'0',常常疑惑它们是什么关系,下面就来分析一下:

1、NULL: 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的指针  ——(void*)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、 ‘\0’:‘\0’是一个“空字符”常量,它表示一个字符串的结束,它的ASCII码值为0(数值0,非字符‘0’)。注意它与空格' '(ASCII码值为32)及'0'(ASCII码值为48)不一样的。

       有一种错误的程序写法:使用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++中,当要给一个字符串添加结束标志时,都应该用‘\0’而不是NULL或0。

综上所述,在内存中  NULL 和  '\0' 和 '0' 都是一个8位的char类型,NULL 和  '\0' 值一样,都是0,以数字方式读取就是0,以字符串读取时就是'\0'或者null(和编译器有关),而 '0' 在内存存储着48,以字符读取就是 '0' ,以数字读取就是48,至于0,可能是char ,int ,float,double等类型,但是值和NULL和'\0'一样,都是0。

 

printf("%d",'0');==>48

printf("%c",'0');==>0

 

printf("%c",0);==>空(即NULL)

printf("%d",0);==>0

 

那么0+'0',0+'\0'分别是什么呢?

printf("%c",0+'\0');==>空(NULL) 先转换成int,然后ASCII编码相加为0,%c输出,转换成char,所以输出NULL

printf("%d",0+'\0');==>0                 先转换成int,然后ASCII编码相加为0,%d输出,不用转换,输出数字0

 

printf("%c",0+'0');==>0

printf("%d",0+'0');==>48
 

你可能感兴趣的:(C语言)