编程语言专题《开发篇,‘\0‘、‘0‘、0 和 NULL 的区别》

1) '\0' 是一个转义字符,它对应的ASCII编码值是0,本质上就是0

2) '0' 是一个字符,它对应的ASCII编码值是48,本质上是48

3)  0 是一个数字,它就是0,本质上就是0

4)  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 ),原因是第一种写法中如果不小心把双等号 == 写成单等号 = ,则编译器不会报错,但是程序的意思完全不一样了,而第二种写法如果不小心把双等号 == 写成了单等号 = ,则编译器会发现并报错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

物联网研究室BBC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值