精华内容
参与话题
问答
  • 0 NULL nullptr浅析

    2017-12-21 15:24:01
    0,NULL,nullptr,std::nullotr_t间的区别 欢迎看以下文章,...

    关于0NULLnullptr的区别

    NULL的定义,其定义在cstddef文件中如下:

    #ifndef NULL

    #define NULL

    #endif

    NULL是用宏实现定义的空指针常量,在C 中的定义为  #define NULL((void *0

    专门用来定义空指针的,C++ 为了兼容C中的老版本NULLC是强类型语言,处理老版本的兼容问题时,必须强转,不然会报错),作了预处理操作,你可以将此看做定义如下:

    #ifdef _cplusplus

    #define NULL 0

    #else

    #define NULL ((void *)0)

    #endif

    C++  11 起 ,#define NULL 0改为了 #define NULL nullptr   nullptr虽然是个宏,你完全可以当作C的定义 (void *0  个人感觉就是C++0 和 (void *0进行了区分,当然区分开了,多个类型检查,相当于细化了指针初始化的检查而已)

    所以如果使用NULL 就和直接使用nullptr相同,当然C++建议使用零值整数字面量(如  int * p = 0),或为std::nullptr_t 类型纯右值 (如:int *p = nullptr,关键词nullptr 指代指针字面量。它是std::nullptr_t 类型的纯右值。存在从nullptr 到任何指针类型及任何指向成员指针类型的隐式转换。

    上面提到的std::nullptr_t cstddef中的定义如下:

     using nullptr_t = decltype(nullptr);  typedef void* nullptr_t;

    即空指针类型,有了这个空指针类型就可以将空指针作为函数参数来重载函数,此时需要注意,因NULL的定义过于复杂,其(void*0的定义适合任意指针函数,所以重载时会出现重定义问题

     

    void print(int *p)

    {

    cout << "hello int" << endl;

    }

    void print(double *p)

    {

    cout << "hello double" << endl;

    }

    void print(std::nullptr_t p) //这里的类型可以看做 void *

    {

    cout << "hello nullptr_t" << endl;

    }

    使用 int *p = NULL或nullptr时,调用print(p),直接调用第一个选项

    使用 double *p = NULL或nullptr时,调用print(p),直接调用第二个选项

    使用 std::nullptr_t p = nullptr时,调用print(p),直接调用第三个选项

    没错你可能已经发现了,第三个重载只能调用std::nullptr_t,类型,不会去隐式的调用其他的类型,即便值相同。

     

    如果开发为了快速好看好维护,初始化指针的时候还是尽量使用nullptr,不要使用0 或者 null,因为后两者在赋值的时候就相当于0值赋值,赋值给指针或者基本类型都没有问题,容易影响他人阅读代码。

     int *p = 0;不如  int *p =NULL;看的直接

    Int *p = NULL;又不如 int *p = nullptr;来的安全 (强类型检查本身就是一种安全的措施之一)。

     

     

     

    展开全文
  • 要区分nullptrNULL,首先要明白NULL的含义: NULL是一个宏定义,在c和c++中的定义不同,c中NULL为(void*)0,而c++中NULL为整数0 //C语言中NULL定义 #define NULL (void*)0 //c语言中NULL为void类型的指针,但允许...

    nullptr是c++11中的关键字,表示空指针

    NULL

    要区分nullptr和NULL,首先要明白NULL的含义:

    NULL是一个宏定义,在c和c++中的定义不同,c中NULL为(void*)0,而c++中NULL为整数0

    //C语言中NULL定义
    #define NULL (void*)0                //c语言中NULL为void类型的指针,但允许将NULL定义为0
    
    //c++中NULL的定义
    #ifndef NULL
    #ifdef _cpluscplus                       //用于判定是c++类型还是c类型,详情看上一篇blog
    #define NULL 0                         //c++中将NULL定义为整数0
    #else
    #define NULL ((void*)0)             //c语言中NULL为void类型的指针
    #endif
    #endif
    
    

    所以在c++中int *p=NULL; 实际表示将指针P的值赋为0,而c++中当一个指针的值为0时,认为指针为空指针

    nullptr

    然后理解nullptr:

    nullptr是一个字面值常量类型为std::nullptr_t,
    空指针常数可以转换为任意类型的指针类型。

    在c++中(void *)不能转化为任意类型的指针,即 int p=(void)是错误的,但int *p=nullptr是正确的,原因:
    对于函数重载:若c++中 (void *)支持任意类型转换,函数重载时将出现问题下列代码中fun(NULL)将不能判断调用哪个函数

    void fun(int i){cout<<"1";};
    void fun(char *p){cout<<"2";};
    int main()
    {
    fun(NULL);  //输出1,c++中NULL为整数0
    fun(nullptr);//输出2,nullptr 为空指针常量。是指针类型
    }
    
    展开全文
  • C/C++:0 NULL nullptr nullptr_t联系与区别

    千次阅读 2019-04-11 10:49:00
    1. 从本质上 1)0是int型的字面值常量 ...3) nullptrnullptr_t 类型的字面值。 2. cstdlib 中 NULL 的定义 #ifdef __cplusplus #define NULL 0 #else #define NULL ((void...

    1. 从本质上

     1) 0是int型的字面值常量

     2) NULL 是预处理变量,定义在 cstdlib 中,其值是0

     3) nullptr 是 nullptr_t 类型的字面值。

     

    2. cstdlib 中 NULL 的定义

     

    #ifdef __cplusplus  
      
    #define NULL 0  
      
    #else  
      
    #define NULL ((void *)0)  
      
    #endif  

     

    之所以这样定义的原因,是因为在C语言中,允许 void* 类型隐式转换为任意指针类型,而C++中不允许这样的强制类型转换,但是可以为任意类型的指针赋0值,因此,在C++中将NULL 定义为0

     

    3. 0 比 NULL 好

    在网上的资料中,均是一致认为 0 比 NULL 好,因为很多可能会出错的时候,使用 0 更直观,如:

    void test(int i){ cout << "in int" << endl; }  
    void test(int * i){ cout << "in int *" << endl; }  
      
    int main()  
    {  
        test(0); //输出 in int  
        test(NULL); //输出 in int  
    } 

    此时,两个函数调用均会调用参数为 int 的 test,使用 0 调动的版本看起来更加直观,因为 0 本身是一个 int 类型的字面值常量,而会潜意识的认为 NULL 应该是一个指针类型,不利于查错

     

    4. nullptr 比 0 更好

    nullptr 是 nullptr_t 类型的常量,而该类型定义了转到任意指针类型的转换操作符,同时不允许该类型的对象转换到非指针类型,在上面的调用例子中,使用 nullptr,将会调用第二个函数,输出 “in int*”,因为 nullptr被转换为了int * ,符合我们通常的理解。对于nullptr_t 的类型可以定义如下: 

     

    class nullptr_t  
    {  
    public:  
        template<class T>  
        inline operator T*() const    //定义类型转换操作符,使nullptr_t 可转为任意非类成员指针类型  
        { return 0; }  
      
          
        //重载类型转换操作符,使 nullptr_t 可以转换为类 C 中任意的指针类型(数据成员指针/函数成员指针)      
        //对类中数据成员的指针,T 将被推导为数据成员的类型 eg: int (X::*); 此时 T 为 int,C 为 X  
        //对类中函数成员的指针,T 将被推导为函数成员的类型 eg: int (X::*)(int); 此时T 等效于: typedef int (T)(int)  
        template<class C, class T>  
        inline operator T C::*() const    
        { return 0; }             
    private:                  
        void operator&() const;  
    };  
      
    const null_ptr nullptr = {}

    5.std::nullptr_t

     

    定义于头文件 <cstddef>

       

    typedef decltype(nullptr) nullptr_t;

      (C++11 起)
         

    std::nullptr_t 是空指针字面量 nullptr 的类型。它是既非指针类型亦非指向成员指针类型的独立类型。

    示例

    若二个重载接受不同指针类型,则需要 std::nullptr_t 的重载以接受空指针常量。

    #include <cstddef>
    #include <iostream>
     
    void f(int* pi)
    {
       std::cout << "Pointer to integer overload\n";
    }
     
    void f(double* pd)
    {
       std::cout << "Pointer to double overload\n";
    }
     
    void f(std::nullptr_t nullp)
    {
       std::cout << "null pointer overload\n";
    }
     
    int main()
    {
        int* pi; double* pd;
     
        f(pi);
        f(pd);
        f(nullptr);  // 无 void f(nullptr_t) 可能有歧义
        // f(0);  // 歧义调用:三个函数全部为候选
        // f(NULL); // 若 NULL 是整数空指针常量则为歧义
                    // (如在大部分实现中的情况)
    }

    输出如下:

    Pointer to integer overload
    Pointer to double overload
    null pointer overload

    总结:

    nullptr 指定空指针值的指针字面量(C++11)

    NULL

    实现定义的空指针常量 
    (宏常量)

    is_null_pointer

    (C++14)

    检查类型是否为 std::nullptr_t 
    (类模板)

     

    参考来源:1.https://zh.cppreference.com/w/cpp/types/nullptr_t

          2.https://www.cnblogs.com/lsgxeva/p/7785303.html

    展开全文
  • 008 区别 : NULL nullptr

    2019-10-03 07:38:28
    /* 目录: 一: NULL本质 二: nullptr本质 */ 一: NULL本质 #ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif #endif...

     

     

    /*
    目录:
       一: NULL本质
       二: nullptr本质
    */

     

    一: NULL本质

    #ifndef NULL
        #ifdef __cplusplus
            #define NULL 0
        #else
            #define NULL ((void *)0)
        #endif
    #endif

     

    二: nullptr本质

    #include "stdafx.h"
    #include <iostream>
    
    void fun(int)
    {
        std::cout << "fun(int)" << std::endl;
    }
    void fun(void *)
    {
        std::cout << "fun(void *)" << std::endl;
    }
    
    int main(int argc, char *argv[])
    {
        fun(NULL);        // 类型 : NULL - int
        fun(nullptr);    // 类型 : nullptr - void *
    
        return 0;
    }
    
    /*
    // result
    fun(int)
    fun(void *)
    */

     

    转载于:https://www.cnblogs.com/huafan/p/11508267.html

    展开全文
  • NULL nullptr nil Nil NSNull

    2015-08-25 09:33:00
    NULLnullptr 在Clang 6.0 的stddef.h文件中可以找到NULLnullptr的声明: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #undefNULL #ifdef__cplusplus #if!defined(__MINGW32_...
  • NULLnullptr

    万次阅读 多人点赞 2018-05-17 18:00:44
    传统意义上来说,c++把NULL、0视为同一种东西,有些编译器将NULL定义为 ((void*)0),有些将其定义为0.c++不允许直接将void*隐式的转化为其他类型,但是如果NULL被定义为 ((void*)0),当编译char *p = NULL;...
  • NULLnullptr

    千次阅读 多人点赞 2018-09-09 17:03:37
    int *p = NULL; 然而啊,有没有想过这是有问题的,比如下面的这段代码: #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; void func(int* num) { cout &lt;&...
  • NULLnullptr

    千次阅读 2015-01-04 16:29:44
    NULLnullptr 0.NULL的前世今生 对于C和C++程序员来说,一定不会对NULL感到陌生。但是C和C++中的NULL却不等价(别惊讶,这是真的)。 NULL表示指针不指向任何对象,但是问题在于,NULL不是关键字,...
  • NULL and nullptr

    2017-10-11 15:31:46
    为什么NULL有时可以赋值给指针,有时不可以? 与头文件中的宏定义有关
  • nullnullptr

    2017-08-16 16:52:41
    引入nullptr的原因引入nullptr的原因,这个要从NULL说起。C和C++中的NULL不等价。NULL表示指针不指向任何对象,但是问题在于,NULL不是关键字,而只是一个宏定义(macro)。NULL在C中的定义 在C中,习惯将NULL定义为...
  • NULLnullptr

    2015-05-19 17:21:58
    NULLnullptr 0.NULL的前世今生 对于C和C++程序员来说,一定不会对NULL感到陌生。但是C和C++中的NULL却不等价(别惊讶,这是真的)。 NULL表示指针不指向任何对象,但是问题在于,NULL不是关键字,而只是一个...
  • NULL 0 nullptr

    2020-03-30 18:02:51
    这里的NULL代表一个空指针,指针吗 结构体 它定义的就是这样 NULL和0一样就是宏定义的#define NULL 0 C++11 引入了nullptr 他就是为了区别开0这个即代表0这一个整数常量有代表空指针常量的这个东西 nullptr只...
  • _])NULL ⇒ \1nullptr (8968 chgs in src, 1153 in lib) - Manually find/change: (void *) nullptrnullptr (1 case) <p>The above bulk edits change the word NULL in a small number of user-visible error ...
  • NULLnullptr区别

    千次阅读 2018-09-09 22:55:09
    NULL来自C语言,一般由宏定义实现,而nullptr则是C++11的新增关键字。在C语言中,NULL被定义为(void*)0,而在C++语言中,NULL则被定义为整数0。编译器一般对其实际定义如下: #ifdef __cplusplus #define NULL 0...
  • C++ NULLnullptr

    千次阅读 2017-05-17 21:54:43
    一,C/C++中的NULL定义 1,C中NULL的定义 #define NULL ((void *)0) C语言中的NULL实质上是一个(void *)指针。 2,C++中NULL的定义 /* Define NULL pointer value */ #ifndef NULL #ifdef __cplusplus #...
  • 在编程逻辑世界,有因必有果,如果一个结果含糊不定(二义性),显然是我们不想要的。C++11中引入nullptr是为了解决NULL的二义性问题。
  • NULLnullptr区别

    2017-07-12 23:07:00
    2019独角兽企业重金招聘Python工程师标准>>> ...

空空如也

1 2 3 4 5 ... 20
收藏数 594,006
精华内容 237,602
关键字:

null