笔记14:C语言中的NULL

C语言中的NULL

一.NULL不是C语言关键字,本质上是一个宏定义
二.NULL的标准定义:
#ifdef  _cplusplus
#define NULL 0
#else
#define NULL (void *)0 //对应C语言情况
#endif

解释:C++的编译环境中,编译器预先定义了一个宏_cplusplus,程序中可以用条件编译来判断当前的编译环境是C++的还是C的

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

三.从指针角度理解NULL的本质

1.

    int *p;    // p是一个函数内的局部变量,则p的值是随机的,也就是说p是一个野指针
    int *p = NULL; //p是一个局部变量,分配在栈上,我们不必关心,但是p的值是(void *)0,实际就是0,意思是指针p指向内存的0地址处。这个时候p就不是野指针了。

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

四.为什么需要NULL?

1.第一个作用就是让野指针指向0地址处
2.第二个作用就是一个特殊标记,按照标准的指针使用步骤是:
int *p = NULL; //定义p时初始化为NULL
p = xx;

.
.
.
p = NULL; //用完之后p再次等于NULL

五.注意不要混用NULL与’\0’

‘\0’ 和 ‘0’ 和 0 和NULL区分开
1. ‘\0’是一个转义字符,它对应的ASCII编码值是0,本质就是0
2. ‘0’是一个字符,它对应的ASCII编码值是48,本质是48
3. 0是一个数字,他就是0,本质就是0
4. NULL是一个表达式,是强制类型转换为void *类型的0,本质是0

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值