zoukankan      html  css  js  c++  java
  • 每日一问12:NULL和nullptr的区别

    每日一问12:NULL和nullptr的区别

    C中的NULL和C++中的NULL

    ​ 在C中,NULL表示空指针,而在C++中,NULL就是整型0。它们各自的定义如下:

    //C
    #define NULL ((void*)0)
    
    //C++
    #define NULL 0
    

    ​ 在C中,NULL是一个void *的指针,使用void*给其他指针赋值时,会隐式转换成相应的类型。而在C++编译器中来编译的话是要出错的,因为C++是强类型的,void *是不能隐式转换成其他指针类型的,除非使用强制转换。为了解决空指针的问题,C++中引入了0来表示空指针。

    #ifdef __cplusplus ---简称:cpp c++ 文件
    #define NULL 0
    #else
    #define NULL ((void *)0)
    #endif
    
    int *i = ((void*) 0);	            //C中正确,C++中不正确
    int *j = NULL;			    //C和C++中都正确,但是具体的细节不同
    
    

    ​ 但是在C++中,不建议使用NULL来替代0表示空指针,因为0不仅是一个空指针,同时也是一个整型常量。如下:

    //运行环境 Visual Studio 2019
    
    void func(int a)
    {
    	cout<<"int a"<<endl;
    }
    void func(int* a)
    {
    	cout<<"int* a"<<endl;
    }
    
    int main()
    {
        func(NULL);					//调用第一个重载函数
        func(0);					//调用第一个重载函数
        func(static_cast<int*>(0));	                //调用第二个重载函数
        func(nullptr);				//调用第二个重载函数
    }
    

    C++ 中的nullptr

    ​ nullptr是C++11引入的关键字,表示空指针,使用nullptr代表指针就消除了C++中,NULL和0的二义性。所以在C++11及以上的版本中,尽量使用nullptr表示空指针,0表示整型常量。

    参考博客:

    1. https://www.cnblogs.com/porter/p/3611718.html
    2. https://zhuanlan.zhihu.com/p/79883965
    3. https://www.jianshu.com/p/09e3b40929ad
  • 相关阅读:
    webpack 压缩js
    系统host文件
    promise
    Cookie与Session
    java普通分页(低级分页)
    容器部署MySQL数据迁移
    每日日报
    每日日报
    每日日报
    每日日报
  • 原文地址:https://www.cnblogs.com/honernan/p/14265628.html
Copyright © 2011-2022 走看看