NULL和nullptr的区别

NULL和nullptr的区别

  • nullptr是在C11中才被加入标准的关键字,原来给指针赋初始值
  • 首先我们来看一下C语言和C++中的NULL是什么
// c语言
#define NULL ((void*)0)
#define NULL 0 
  • 因为c语言中可以隐式类型转换,所以NULL赋给指针,使用上面两宏定义都可以
// C++
#ifdef __cplusplus
    #define NULL 0
#else
    #define NULL ((void*)0)
#endif
  • 在C++中NULL被定义为常量0,而不是((void*)0),是因为C++是强类型语言,void指针不能隐式转换成其他类型的指针,所以就定义成((void *)0)

例如:

// c++环境中
int *p = NULL; // NULL被定义为0
int *p = (int*)NULL; // NULL被定义为((viod*)0)
  • 所以在C++中NULL中就定义成0,但是有时候为了方便又会有其他的错误

例如下例:

#include<iostream>
#include<cstdio>

using namespace std;

void func(int address) {
    cout << "address is a number" << endl;
}

void func(int* address) {
    cout << "address is a pointer" << endl;
}

int main()
{
    func(NULL);
    func(nullptr);
    return 0;
}
  • 在这个例子中,第一个使用NULL调用func函数会输出 adderess is a number, 而第二个使用nullpter调用函数func就会打印 address is a pointer
  • 此时就就体现了NULL在C++中的二义性了,明明我们使用NULL是要调用第二个函数,但是却调用第一个函数,这有两个原因:首先NULL在C++中被定义为0,然后就是由于C++中的函数匹配机制,所以在C11中添加了nullptr

在C++中nullptr的定义如下:

const //常量
class
{
public:
    template<class T>
    operator T*() const //向任意类型的非成员指针转换
    {
        return 0;
    }

    template<class C, class T>
    operator T C::*() const //向任意类型的成员指针转换
    {
        return 0;
    }

private:
    void operator&() const // 不可取地址
    {
    }
} nullptr = {};
  • 在C11中,nullptr实质上被当作一个常量,可以进行任意指针类型的转换,且不能够被取地址

**总结:**从C11之后我们给指针赋值应该是要nullptr,而C语言中因该是要NULL,以免以后在开发中出现细微的问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值