C中空指针、NULL与0

空指针是指确保可以没有指向任何一个对象的指针。空指针常量值通常使用宏定义NULL来表示。

空指针和任何非空指针比较都不相等,因此经常作为函数异常时的返回值使用。

链表也经常在数据末尾放一个空指针提示后续没有数据。

那么NULL是什么呢?

通常情况下,NULL就是0.

例如有些代码里会把NULL宏定义成这样:

#define NULL 0

但是0与NULL不是完全等价的。

例如字符串使用’\0’结束,但是如果使用NULL结束字符串,应该认为这是错误的。

既然“指针就是地址”,那么空指针是不是就是为0的地址呢?大多数情况下这是正确的,但是由于硬件的原因,也可能存在值不为0的空指针。

这时是不是应该把NULL宏定义为其他的值呢?

这样的想法是有偏差的,这涉及到问题的内部根源。

比如

int *p = 3;

这样的代码是有编译警告的,因为指针类型和int类型毕竟是不一样的;

但是

int *p = 0;

反倒没有问题。

这是因为在C中,“当常量0处于应该作为指针使用的上下文中时,它就作为空指针使用”。

推荐的宏定义方法是:

#define NULL ((*void)0)

显式声明的目的是,防止编译器理解不了“根据上下文将0作为指针处理”以提高可移植性,比如以下场景:

. 没有原型声明的函数的参数

. 可变长参数函数中的可变部分的参数

在ANSI C中,因为引入了原型声明,只有在确实做了原型声明的情况下,编译器才知道你“想要传递指针”。

posted on 2019-10-11 15:15  freshair_cn  阅读(935)  评论(0编辑  收藏  举报

导航