精华内容
下载资源
问答
  • nullptr和null区别

    2021-04-11 15:50:02
    null在c语言中是表示空指针,其定义:#define NULL ((void *)0),null实际上是一个void * 的指针,在赋值使用过程中,null可以隐式转换为相应的类型。 int *p =null; C++中NULL是无法隐式转换为其他类型的,在C++中...

    null在c语言中是表示空指针,其定义:#define NULL ((void *)0),null实际上是一个void * 的指针,在赋值使用过程中,null可以隐式转换为相应的类型。

    int *p =null;
    

    C++中NULL是无法隐式转换为其他类型的,在C++中,null表示0,定义:#define NULL 0

    #ifdef __cplusplus ---简称:cpp c++ 文件
    #define NULL 0
    #else
    #define NULL ((void *)0)
    #endif
    

    C++11中nullptr表示一个空指针,可以转换为任意类型的指针类型。

    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++中(void *)不能转换为任意类型的指针,即int *p = (void *)时错误的,但int *p = nullptr 是正确的。

    参考1
    参考2

    展开全文
  • 【C++】nullptrNULL区别

    千次阅读 2020-07-25 15:50:16
    1. nullptr和NULL类型区别 NULL是一个无类型的东西,而且是一个宏。0为null pointer constant的。赋予null pointer,应该是使用0,而非NULLnullptr是有类型的(放了在stddef头文件中),类型是 typdef decltype...

    1. nullptr和NULL类型区别

    • NULL是一个无类型的东西,而且是一个宏。0为null pointer constant的。赋予null pointer,应该是使用0,而非NULL。
    • nullptr是有类型的(放了在stddef头文件中),类型是 typdef decltype(nullptr) nullptr_t;

    2. C++中NULL使用存在的问题

    • 在c语言环境下,由于不存在函数重载等问题,直接将NULL定义为一个void*的指针就可以完美的解决一切问题。
    • 在c++环境下情况就复杂起来, 首先我们将void*直接赋值给一个指针是不合法的,编译器会报错。有重载或者模板推导的时候,编译器就无法给出正确结果。

    3. nullptr的应用:

    直接使用nullptr来替代NULL的宏定义,正常使用中它们完全等价。

    4. 模拟nullptr的实现:

    //[cpp]  www.2cto.com
    const class nullptr_t_t  
    {  
    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_t = {};  
    #undef NULL  
    #define NULL nullptr_t   
    
    
    展开全文
  • nullptrNULL区别

    2020-08-19 16:04:16
    在《NULL,0,'\0',"0","\0"的区别》一文中,我们已经知道了在C中NULL是什么,在C的头文件中,通常定义如下: #define NULL ((void*)0) 但是在C++中,它是这样定义的: #define NULL 0 或者你可以在stddef.h看到...

    前言

    在C语言中,我们常常用NULL作为指针变量的初始值,而在C++中,却不建议你这么做。

    NULL是什么

    《NULL,0,'\0',"0","\0"的区别》一文中,我们已经知道了在C中NULL是什么,在C的头文件中,通常定义如下:

    #define NULL ((void*)0)

    但是在C++中,它是这样定义的:

    #define NULL 0

    或者你可以在stddef.h看到完整的这段:

    #undef NULL
    #if defined(__cplusplus)
    #define NULL 0
    #else
    #define NULL ((void *)0)
    #endif

    也就是说,在C++中,NULL不过也是0罢了,把它当成空指针只是一个无可奈何的选择罢了。

    那么为什么在C++和C中不一样呢?因为C++中不能将void *类型的指针隐式转换成其他指针类型,从下面的例子可以看出来:

    //null.cpp
    #include<iostream>
    int main(void)
    {
        char p[] = "12345";
        int *a = (void*)p;
        return 0;
    }

    编译:

    $ g+ -o null null.cpp
    null.cpp: In function 'int main()':
    null.cpp:5:17: error: invalid conversion from 'void*' to 'int*' [-fpermissive]
      int *a =(void*)p;

    所以不能将NULL定义为(void*)0。

    nullptr

    nullptr并非整型类别,甚至也不是指针类型,但是能转换成任意指针类型。nullptr的实际类型是std:nullptr_t。

    为什么该使用nullptr

    回到最开始的问题,为什么作为指针的语义,我们应该使用nullptr,而不是NULL。 请看下面的代码:

    #include<iostream>
    using namespace std;
    void test(void *p)
    {
        cout<<"p is pointer "<<p<<endl;
    }
    void test(int num)
    {
        cout<<"num is int "<<num<<endl;
    }
    int main(void)
    {
    
        test(NULL);
        return 0;
    }

    编译:

    $ g++ -o test test.cpp
    main.cpp: In function ‘int main()’:
    main.cpp:16:14: error: call of overloaded ‘test(NULL)’ is ambiguous
         test(NULL);

    很不幸,编译报错了,提示我们有二义性,按照《重载函数匹配规则》,两个都可以匹配,因此最终报错。

    但是如果我们使用nullptr却不会:

    test(nullptr);

    除了这点之外,在C++模板中它还有更好的表现。 看下面的代码:

    #include<iostream>
    using namespace std;
    template<typename Type1,typename ptrType>
    void test(Type1 fun,ptrType ptr)
    {
        /*do something*/
        fun(ptr);
        return;
    }
    void fun(int *val)
    {
        cout<<"fun"<<endl;
    }
    int main(void)
    {
        test(fun,NULL);
        return 0;
    }

    编译报错了:

    main.cpp:8:8: error: invalid conversion from ‘long int’ to ‘int*’ [-fpermissive]
         fun(ptr);

    很显然NULL被推导为long int,而不是空指针,因而导致函数类型不匹配而报错。

    但是如果我们用nullptr就不会有上面的问题。

    总结

    如果你想表示空指针,那么使用nullptr,而不是NULL。

    注:nullptr在C++ 11中才出现。

     

    转载自https://cloud.tencent.com/developer/article/1494848

    展开全文
  • nullptr和NULL区别

    千次阅读 2016-12-01 13:49:20
    为什要有nullptrnullptr应用场景

    1、为什要有nullptr
    我们给一个指针赋初值的时候一般这么写 FILE* fp = NULL; 这里有个NULL的定义,一般情况下它是这么定义的:

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

    在c语言环境下,由于不存在函数重载等问题,直接将NULL定义为一个void*的指针就可以完美的解决一切问题。但是在c++环境下情况就变得复杂起来, 首先我们不能写这样的代码 FILE* fp = (void*)0; 将void*直接赋值给一个指针是不合法的,编译器会报错。 我们只能这样写代码

    FILE* fp = (FILE*)0;  // or  FILE* fp = 0;  

    所以在c++下面,NULL就被直接定义为一个整型 0。 在大多数情况下这并不会产生什么问题,但是万一有重载或者模板推导的时候,编译器就无法给出正确结果了。比如下面的情形:

    void call_back_process(CCObject* target, void* data);  
    bind(call_back_process, target, NULL);   
    // error 函数类型是void* ,但是我们绑定的是一个整型 0 

    2、 nullptr的应用场景:
    如果我们的编译器是支持nullptr的话,那么我们应该直接使用nullptr来替代NULL的宏定义。正常使用过程中他们是完全等价的。

    3、模拟nullptr的实现:
    某些编译器不支持c++11的新关键字nullptr,我们也可以模拟实现一个nullptr

        class nullptr_t_t  {  
        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_t = {};  
        #undef NULL  
        #define NULL nullptr_t

    nullptr是std::nullptr_t类型的(constexpr)变量。std::nullptr_t可以显式或隐式地转换为任何指针(包括类的成员函数指针),但不能显式或隐式地转换为任何其他类型。

    1)std::nullptr_t不能用于算术表达式,即,不能+、-、*等;

    2)std::nullptr_t可以用于关系表达式,两个std::nullptr_t类型的变量,进行==、<=、>=运算都会返回true,其他的关系运算返回false;

    3)nullptr不能进行&(取地址)运算。

    展开全文
  • C++11新特性之nullptr和NULL区别

    千次阅读 2018-05-18 15:56:15
    看起来NULL和nullptr都是代表空指针,但是NULL在重载函数的时候却匹配到了参数为int的那个版本。  这是因为在C++中,NULL的定义一般是这样的: #ifdef __cplusplus #define NULL 0 #else #define NULL ((void...
  • C++中NULL和nullptr区别

    万次阅读 多人点赞 2018-11-22 19:14:39
    在编写C程序的时候只看到过NULL,而在C++的编程中,我们可以看到NULL和nullptr两种关键字,其实nullptr是C++11版本中新加入的,它的出现是为了解决NULL表示空指针在C++中具有二义性的问题,为了弄明白这个问题,我...
  • nullptr和NULL 区别

    2014-07-24 10:10:00
    注:本文内容摘自网络,准确性有待验证,现阶段仅供学习参考...1、为什要有nullptr 我们给一个指针赋初值的时候一般这么写 FILE* fp = NULL; 这里有个NULL的定义,一般情况下它是这么定义的: [cpp] #ifd...
  • 一文搞懂 NULL nullptr区别【C/C++面试必备】

    千次阅读 多人点赞 2021-07-04 10:00:14
    大家可能对 NULL nullptr 都有了解,NULL最开始是在 C语言中使用,后来 C++11 引入了nullptr。 为什么 C++11 要引入 nullptr 呢? 那一定是 NULL 在某些方面存在哪些不足,所以引入了nullptr,下面我们来看一下...
  • null和NULL和nullptr和””区别

    万次阅读 2016-04-26 12:47:11
    突然想到这个有趣的问题:C语言C++对大小写是敏感的,也就是说null和NULL区别对待的。NULL代表空地址,null只是一个符号。
  • C++_nullptr和NULL 区别

    千次阅读 2019-02-09 13:13:46
    https://www.cnblogs.com/Philip-Tell-Truth/p/6594632.html
  • 在写C++的程序的时候,可以看到NULL 和nullptr两种空指针。他们有哦什么区别勒? 一、C程序中的NULL 在C语言中,NULL通常被定义为:#define NULL ((void *)0) 所以说NULL实际上是一个空指针,如果在C语言中写入...
  • NULL和nullptr区别

    2019-08-15 11:41:01
    所以,C++11加入了nullptr,可以保证在任何情况下都代表空指针,而不会出现上述的情况,因此,建议以后还是都用nullptr替代NULL吧,而NULL就当做0使用。 原文链接:https://blog.csdn.net/qq_1...
  • C++11 中的指针空值nullptr和NULL区别

    千次阅读 2019-04-16 00:57:29
    C++98中的指针空值-----NULL 本质是一个宏,存在于C头文件(stddef.h)中 NULL可能被定义为字面常量0(编译器默认),或者被定义为无类型指针(void*)的常量(如果要将其按照指针方式来使用,必 须对其进行强转(void...
  • NULLnullptr和0的区别

    千次阅读 多人点赞 2018-10-19 13:30:49
    在进行C/C++编码时,我们经常会用到空指针,这里简单介绍一下NULLnullptr以及0的区别。 一、NULL和0 NULL其实就是整数0,头文件中通过宏定义将NULL定义为0。 因此,当调用如下代码时,编译将会产生歧义 void ...
  • C++中nullptr和NULL

    2020-08-27 17:55:23
    在C99里面,NULL可以被定义为0或者0L(32位64位的区别),或者直接就是由0或者0L转成的void*。 问题: 函数重载的问题: void func(int a); void func(void *a); 对于上面两个重载的函数,func(NULL)会使用上面...
  • NULL和nullptr区别

    千次阅读 2018-09-09 22:55:09
    NULL来自C语言,一般由宏定义实现,而nullptr则是C++11的新增关键字。在C语言中,NULL被定义为(void*)0,而在C++语言中,NULL则被定义为整数0。编译器一般对其实际定义如下: #ifdef __cplusplus #define NULL 0...
  • 1、空指针,null pointer,不指向任何对象,在试图使用一个指针之前必须要检查这个指针是不是空指针。 2、举例子: int *p1=nullptr; 等价于: int *p1=0; // 直接将 p1 初始化为字面值常量 nullptr 或者 ...
  • [C++11] nullptr NULL

    2020-11-03 20:37:47
    在工作中,避免产生“野...C++11 新增关键字 nullptr ,专门用来初始化空类型指针;而 NULL 则表示 0。 eg: #include <iostream> using namespace std; void test_null(void* v) { cout << "void*" .
  • NULL和nullptr区别c++qt

    2020-07-25 10:42:29
    c++中空指针都用nullptr任何时候都是完全没问题的 c中都用NULL 详细的一些介绍,看如下博客: https://blog.csdn.net/qq_18108083/article/details/84346655 ...
  • 0,NULL和nullptr区别

    2020-06-23 07:56:07
    这次我回过头给大家讲解一下大家平常使用非常平凡0,NULL和nullptr区别。 别问我为什么要介绍他们的区别那我只能用图来表示我的回答 一.在C语言中 NULL其实就是一个宏(表示把 0 强制类型转换成void *) #...
  • c/c++ nullptr和NULL

    2020-05-17 12:41:00
    要区分nullptr和NULL,首先要明白NULL的含义: NULL是一个宏定义,在cc++中的定义不同,c中NULL为(void*)0,而c++中NULL为整数0 所以在c++中int *p=NULL; 实际表示将指针P的值赋为0,而c++中当一个指针的值为0时,...
  • 如果使用 nullptr 初始化对象,就能避免 0 指针的二义性的问题。 NULL在C语言中被定义为 #define NULL ((void *)0) NULL在c++中被定义为 #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 44,942
精华内容 17,976
关键字:

nullptr和null区别