c语言null和nullptr,nullptr与NULL

在 C语言 中,我们使用 NULL

表示空指针,它实际上是一个宏,具体被定义为,

/* C 语言程序 */

#define NULL ((void*)0)

#define NULL 0 /* 两者皆可 */

注:因为在C语言中,是允许 void

指针隐式转换为其它类型指针的,所以 #define NULL ((void*)0)

这样的定义不会有问题。

C++语言出现后,为了保持对C语言的兼容,保留了 NULL

,但对 NULL

的定义变得更为严格,

/* C++ 语言程序 */

#ifdef __cplusplus

#define NULL 0

#else

#define NULL ((void*)0)

#endif

NULL

被定义为0,而不是 ((void*)0)

,因为在C++语言中, void

指针是不可以隐式转换为其它类型指针的,必须显示转换,

/* C++ 语言程序 */

#define NULL ((void*)0) /* 如果在 C++ 语言中这么定义的话 */

int* a = NULL; /* 隐式转换,错误 */

int* a = (int*)NULL; /* 显示转换,正确,但很麻烦,所以 NULL 都会被定义为 0 */

在C++ 98之前(包括C++ 98),在对 NULL

的使用上,都一直存在一个问题,假设有下面的代码,

/* C++ 语言程序 */

void func(int i);

void func(char* p);

func(NULL); /* 该调用哪个?*/

NULL

其实就是等于0,对于上面的两个函数,它都是符合的,如此,就会出现语义二义性的错误。

为了解决上述重载函数所带来的问题,C++ 11的 nullptr

应运而生。 nullptr

实质上是一个常量,实现代码大致如下,

/* C++ 语言程序 */

const /* 常量 */

class

{

public:

template

operator T*() const /* 向任意类型的非成员指针转换 */

{

return 0;

}

template

operator T C::*() const /* 向任意类型的成员指针转换 */

{

return 0;

}

private:

void operator&() const /* 不可取地址 */

{

}

} nullptr = {};

nullptr

只是一个常量,这就意味着我们可以在程序中随意定义一个与其名称相同的标识符,但因为 nullptr

在实际编程中的应用实在太广泛,因此C++编译器一般都会把 nullptr

定为关键字,避免 程序员 的滥用。

当然,C++ 11发布后,并没有因为 nullptr

的出现,而摒弃 NULL

,主要是为了兼容旧版程序。

最后,总结一下,

在C语言编程中,请使用 NULL

此时的 NULL

,要么是 ((void*)0)

,要么是0,对于C语言而言,都无所谓。

在C++语言编程中,请使用 nullptr

既为了避免以后出现bug,也为了养成一个良好的编程习惯。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值