NULL,'\0',0,'/0'和"0"的区别

最近发现对于NULL,’\0’,0,’/0’和”0”的区别有点混淆了。所以在查阅资料之后,将笔记记录在此处,免得下次忘记了可以看看。

NULL

NULL 即空指针,在C和C++中的形式不一样,msdn上有如下的内容那个:

1
2
3
4
5
6
7
#if !defined(NULL)&&defined(__NEEDS_NULL)
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif

NULL 在c中用(void*)0表示,在c++中用0表示。

‘\0’和’0’

  1. ‘\0’表示字符串结束,它在ASCII中的值为0(数值0,非字符‘0’。所以在数值上NULL, ‘\0’,0是一样的,都是0,但’0’就不同了,在ASCII码中编码为48,所以字符0和上述三个值不同。

  2. 在内存中NULL'\0''0'都是一个8位的char类型,NULL 和’\0’ 值一样,都是0,以数字方式读取就是0,以字符串读取时就是’\0’或者null(和编译器有关)。

  3. '0'在内存存储着48,以字符读取就是'0',以数字读取就是48,至于0,可能是char ,int ,float,double等类型,但是值和NULL'\0'一样,都是0

‘/0’和’\0’

我在写C代码时,经常把’\0’写成’/0’。其实这两者之间差别很大的。因为’/0’表示的是两个字符了,一个是’/‘, 另一个’0’。
而’\0’表示的字符串结束,值为0。

“0”

“0”表示的是字符串,即在存储中存储了两个内容,一个是’0’(即字符0),另一个是字符串结束符’\0’(也即数字0)。

举例

为了说明情况,下面列举了几个例子。

1
2
3
4
5
6
7
8
9
10
11
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

分享到 评论