8-5C语言中的NULL

本文详细探讨了C语言中的NULL,包括其非关键字的宏定义性质,本质是0且作为指针地址的特殊意义。NULL的主要作用是为野指针提供安全的默认值和作为特殊标记。同时强调了NULL与''的区别,防止在使用中混淆。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

8.5.1 NULL在C/C++中的标准定义

(1)NULL不是C语言关键字,本质上是一个宏定义;
(2)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地址开始的一段内存)。

8.5.2 从指针角度理解NULL的本质

(1)int *p; //p是一个函数内的局部变量,则p的值是随机的,也就是说p是一个野指针。
(2)int *p = NULL; //p是一个局部变量,分配在栈上的地址是由编译器决定的,我们不必关心,但是p的值是(void *)0,实际就是0,意思是指针p指向内存的0地址处,这时候p就不是野指针了。
(3)为什么要让一个野指针指向内存地址0处?主要是因为在大部分的CPU中,内存的0地址处都不是可以随便访问的(一般都是操作系统严密监控区域,所以应用程序不能随便访问)。所以野指针指向了这个区域可以保证野指针不会造成误伤。如果程序无意识的解引用指向0地址处的野指针则会触发段错误。这样就可以提示你帮助你找到程序中的错误。(问题:这里在给p赋值的时候,NULL进行了强制类型转换吗?即(void *)转换为(int *)?).

8.5.3 为什么需要NULL

(1)第一个作用就是让野指针指向0地址处,安全。
(2)第二个作用就是一个特殊标记。按照标准的指针使用步骤是:

int  *p = NULL;		//定义p时立即初始化为NULL
p = xxx;
if(NULL  !=  P)
{
	*P   		//在确定p不等于NULL的情况下才去解引用p
}
p = NULL;		//用完之后再次等于NULL

注意:一般比较一个指针和NULL是否相等,不写成

if(p  ==  NULL),而写成ifNULL == p)。

原因是第一种写法中如果不小心把两个=写成了=,则编译器不会报错,但是程序的意思完全不一样了;而第二种写法如果不小心把==写成=则编译器会发现并报错。

8.5.4 注意不要混用NULL与‘\0’

(1)‘\0’和‘0’和0和NULL几个区分开。
(2)‘\0’是一个转义字符,它对应的ASCII编码值是0,本质就是0.
(3)‘0’是一个字符,它对应的ASCII编码值是48,本质是48.
(4)0是一个数字,它就是0,本质就是0.
(5)NULL是一个表达式,是强制类型转换为void *类型的0,本质是0.
(6)‘\0’用法是C语言字符串的结尾标志,一般用来比较字符串中的字符以判断字符串有没有到头;‘0’是字符0,对应0这个字符的ASCII编码,一般用来获取0的ASCII码值;0是数字,一般用来比较一个int类型的数字是否等于0;NULL是一个表达式,一般用来比较指针是否是一个野指针。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

非主流的豆瓣

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

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

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

打赏作者

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

抵扣说明:

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

余额充值