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

0 ‘0’ ‘\0’ NULL 他们大体上并没有区别 都表示零的意思,但是在含以上有一定区别 ,下面介绍0 ‘0’ ‘\0’ NULL 的区别
0 : 就是数字0
‘0’: 字符零 他的ASCII的值是48
‘\0’ : 转移字符代表一段字符串的结束,本意上也是0
NULL: NULL 是一个表达式,是强制类型转换为void*类型的0,本质是0
再谈NULL,NULL不是C语言关键字,本质上是一个宏定义,在C/C++中NULL的标准定义是这样的:

#ifdef _cplusplus
#define NULL 0
#else
#define NULL (void *) 0
#endif

在C语言中NULL的本质是0,但是这个0不是当一个数字来解析,而是当一个内存地址来解析的,这个0其实是0x00000000,代表内存的0地址。(void *) 0 这个整体表达式表示一个指针。这个指针变量本身占4个字节,地址指向哪里取决于指针变量本身,这个指针变量的值是0,也就是说这个指针变量指向0地址(实际是0地址开始的一段内存)

我们经常会定义 int *p = NULL 来初始化防止野指针,但是为什么要让一个野指针指向内存0地址处呢?

主要是因为在大部分的CPU中,内存的0地址处都不是可以随便访问的,一般都是操作系统严密管控区域,所以应用程序不能随便访问,所以野指针指向了这个区域可以保证野指针不会造成误伤,如果程序无意识地解引用,指向0地址处的野指针则会出发段错误,这样就可以提示你找出程序中的错误。

注意:一般比较一个指针和NULL是否相等不要写成 if ( p == NULL ),而写成 if ( NULL == p ),原因是第一种写法中如果不小心把双等号 == 写成单等号 = ,则编译器不会报错,但是程序的意思完全不一样了,而第二种写法如果不小心把双等号 == 写成了单等号 = ,则编译器会发现并报错

猜你喜欢

转载自blog.csdn.net/belongHWL/article/details/91411446
今日推荐