精华内容
参与话题
问答
  • nullptr和NULL

    2019-10-18 19:44:56
    nullptr是c++11中的关键字,表示空指针 //C语言中NULL定义 #define NULL (void*)0 //c语言中NULL为void类型的指针,但允许将NULL定义为0 //c++中NULL的定义 #ifndef NULL #ifdef _cpluscplus //用于判定是c++类型...

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

    //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是一个字面值常量,类型为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++中NULL和nullptr的区别

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

    在编写C程序的时候只看到过NULL,而在C++的编程中,我们可以看到NULL和nullptr两种关键字,其实nullptr是C++11版本中新加入的,它的出现是为了解决NULL表示空指针在C++中具有二义性的问题,为了弄明白这个问题,我查找了一些资料,总结如下。

    一、C程序中的NULL

    在C语言中,NULL通常被定义为:#define NULL ((void *)0)

    所以说NULL实际上是一个空指针,如果在C语言中写入以下代码,编译是没有问题的,因为在C语言中把空指针赋给int和char指针的时候,发生了隐式类型转换,把void指针转换成了相应类型的指针。

    int  *pi = NULL;
    char *pc = NULL;

    二、C++程序中的NULL

    但是问题来了,以上代码如果使用C++编译器来编译则是会出错的,因为C++是强类型语言,void*是不能隐式转换成其他类型的指针的,所以实际上编译器提供的头文件做了相应的处理:

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

    可见,在C++中,NULL实际上是0.因为C++中不能把void*类型的指针隐式转换成其他类型的指针,所以为了结果空指针的表示问题,C++引入了0来表示空指针,这样就有了上述代码中的NULL宏定义。

    但是实际上,用NULL代替0表示空指针在函数重载时会出现问题,程序执行的结果会与我们的想法不同,举例如下:

    #include <iostream>
    using namespace std;
    
    void func(void* i)
    {
    	cout << "func1" << endl;
    }
    
    void func(int i)
    {
    	cout << "func2" << endl;
    }
    
    void main(int argc,char* argv[])
    {
    	func(NULL);
    	func(nullptr);
    	getchar();
    }

      

    在这段代码中,我们对函数func进行可重载,参数分别是void*类型和int类型,但是运行结果却与我们使用NULL的初衷是相违背的,因为我们本来是想用NULL来代替空指针,但是在将NULL输入到函数中时,它却选择了int形参这个函数版本,所以是有问题的,这就是用NULL代替空指针在C++程序中的二义性。

    三、C++中的nullptr

    为解决NULL代指空指针存在的二义性问题,在C++11版本(2011年发布)中特意引入了nullptr这一新的关键字来代指空指针,从上面的例子中我们可以看到,使用nullptr作为实参,确实选择了正确的以void*作为形参的函数版本。

    总结:

    NULL在C++中就是0,这是因为在C++中void* 类型是不允许隐式转换成其他类型的,所以之前C++中用0来代表空指针,但是在重载整形的情况下,会出现上述的问题。所以,C++11加入了nullptr,可以保证在任何情况下都代表空指针,而不会出现上述的情况,因此,建议以后还是都用nullptr替代NULL吧,而NULL就当做0使用。

    其他:在没有C++ 11的nullptr的时候,我们怎么解决避免这个问题呢?

    const class nullptr_t
    {
    public:
        template<class T>
        inline operator T*() const
            { return 0; }
    
        template<class C, class T>
        inline operator T C::*() const
            { return 0; }
    
    private:
    void operator&() const;
    } nullptr = {};

     

    展开全文
  • nullptr详解

    千次阅读 2016-12-15 11:04:50
    1. 引入nullptr的原因 引入nullptr的原因,这个要从NULL说起。对于C和C++程序员来说,一定不会对NULL感到陌生。但是C和C++中的NULL却不等价。NULL表示指针不指向任何对象,但是问题在于,NULL不是关键字,而只是一...

    1. 引入nullptr的原因

    引入nullptr的原因,这个要从NULL说起。对于C和C++程序员来说,一定不会对NULL感到陌生。但是C和C++中的NULL却不等价。NULL表示指针不指向任何对象,但是问题在于,NULL不是关键字,而只是一个宏定义(macro)。

    1.1 NULL在C中的定义

    在C中,习惯将NULL定义为void*指针值0:
    1. #define NULL (void*)0  
    但同时,也允许将NULL定义为整常数0

    1.2 NULL在C++中的定义

    在C++中,NULL却被明确定义为整常数0:
    1. // lmcons.h中定义NULL的源码  
    2. #ifndef NULL  
    3. #ifdef __cplusplus  
    4. #define NULL    0  
    5. #else  
    6. #define NULL    ((void *)0)  
    7. #endif  
    8. #endif  

    1.3为什么C++在NULL上选择不完全兼容C?

    根本原因和C++的重载函数有关。C++通过搜索匹配参数的机制,试图找到最佳匹配(best-match)的函数,而如果继续支持void*的隐式类型转换,则会带来语义二义性(syntax ambiguous)的问题。
    1. // 考虑下面两个重载函数  
    2. void foo(int i);  
    3. void foo(char* p)  
    4.   
    5. foo(NULL); // which is called?  

    2. nullptr的应用场景

    2.1 编译器

    如果我们的编译器是支持nullptr的话,那么我们应该直接使用nullptr来替代NULL的宏定义。正常使用过程中他们是完全等价的。
    对于编译器,Visual Studio 2010已经开始支持C++0x中的大部分特性,自然包括nullptr。而VS2010之前的版本,都不支持此关键字。
    Codeblocks10.5附带的G++ 4.4.1不支持nullptr,升级为4.6.1后可支持nullptr(需开启-std=c++0x编译选项)

    2.2 使用方法

    0(NULL)和nullptr可以交换使用,如下示例:
    1. int* p1 = 0;  
    2. int* p2 = nullptr;  
    3.   
    4. if(p1 == 0) {}  
    5. if(p2 == 0) {}  
    6. if(p1 == nullptr) {}  
    7. if(p2 == nullptr) {}  
    8. if(p1 == p2) {}  
    9. if(p2) {}  
    不能将nullptr赋值给整形,如下示例:
    1. int n1 = 0;             // ok  
    2. int n2 = nullptr;       // error  
    3.   
    4. if(n1 == nullptr) {}    // error  
    5. if(n2 == nullptr) {}    // error  
    6. if(nullprt) {}          // error  
    7. nullptr = 0             // error  
    上面提到的重载问题,使用nullptr时,将调用char*。
    1. void foo(int)   {cout << "int" << endl;}  
    2. void foo(char*) {cout << "pointer" << endl;}  
    3.   
    4. foo(0);       // calls foo(int)  
    5. foo(nullptr); // calls foo(char*)  

    3. 模拟nullptr的实现

    某些编译器不支持c++11的新关键字nullptr,我们也可以模拟实现一个nullptr。
    1. const  
    2. class nullptr_t_t  
    3. {  
    4. public:  
    5.     template<class T>           operator T*() const {return 0;}  
    6.     template<class C, class T>  operator T C::*() const { return 0; }  
    7. private:  
    8.     void operator& () const;  
    9. } nullptr_t = {};  
    10. #undef NULL  
    11. #define NULL nullptr_t  
    展开全文
  • C++11中nullptr的使用

    千次阅读 2016-06-30 21:22:45
    在C语言中,NULL实际上是一个void* 的指针,然后把void* 指针赋值给其它类型的指针的时候,会隐式转换成相应的类型。而如果用一个C++编译器来编译的时候是要出错...nullptr是有类型的,类型是std::nullptr_t。 推荐...

    在C语言中,NULL实际上是一个void* 的指针,然后把void* 指针赋值给其它类型的指针的时候,会隐式转换成相应的类型。而如果用一个C++编译器来编译的时候是要出错的,因为C++是强类型的,void* 是不能隐式转换成其它指针类型的。在C++中为了解决空指针的问题,在C++中引入0来表示空指针。NULL无类型,它是一个宏。nullptr是有类型的,类型是std::nullptr_t。

    推荐:纯C语言用NULL;C++用0;如果编译器支持nullptr,使用nullptr。

    The keyword nullptr denotes the pointer literal. It is a prvalue(pure rvalue) of type std::nullptr_t. There exist implicit conversions from nullptr to null pointer value of any pointer type and any pointer to member type. Similar conversions exist for any null pointer constant, which includes values of type std::nullptr_t as well as the macro NULL.

    Both true and false are keywords and as literals they have a type ( bool ). nullptr is a pointer literal of type std::nullptr_t, and it's a prvalue (you cannot take the address of it using &).

    A null pointer constant with the nullptr value has the following characteristics:

    (1)、It can be converted to any pointer or pointer-to-member type.

    (2)、It cannot be implicitly converted to any other type, except for the bool type.

    (3)、It cannot be used in an arithmetic expression.

    (4)、It can be compared with the integer 0.

    (5)、It can be used in relational expressions to compare with pointers or data of the std::nullptr_t type.

    It should be noted that in C++11 it is still acceptable to assign the value 0 or NULL to a pointer.

    在VS2013中,NULL的定义是在stdio.h文件中,如下:

    /* Define NULL pointer value */
    #ifndef NULL
    #ifdef __cplusplus
    #define NULL    0
    #else  /* __cplusplus */
    #define NULL    ((void *)0)
    #endif  /* __cplusplus */
    #endif  /* NULL */

    下面是从其他文章中copy的测试代码,详细内容介绍可以参考对应的reference:

    #include "nullptr.hpp"
    
    #include <iostream>
    #include <cstddef> // for std::nullptr_t
    
    ///
    // reference: http://en.cppreference.com/w/cpp/language/nullptr
    template<class F, class A>
    void Fwd(F f, A a)
    {
    	f(a);
    }
    
    void g(int* i)
    {
    	std::cout << "Function g called\n";
    }
    
    int test_nullptr1()
    {
    	g(NULL);           // Fine
    	g(0);              // Fine
    
    	Fwd(g, nullptr);   // Fine
    	// Fwd(g, NULL);  // ERROR: No function g(int) // error C2664: “void (int *)”: 无法将参数 1 从“int”转换为“int *”
    
    	int length1 = sizeof(NULL); // x64, length1 = 4
    	int length2 = sizeof(nullptr); // x64, length2 = 8
    
    	return 0;
    }
    
    ///
    // reference: https://msdn.microsoft.com/zh-cn/library/4ex65770.aspx
    class MyClass {
    public:
    	int i;
    };
    
    int test_nullptr2()
    {
    	MyClass * pMyClass = nullptr;
    	if (pMyClass == nullptr)
    		std::cout << "pMyClass == nullptr" << std::endl; // pMyClass == nullptr
    
    	if (pMyClass == 0)
    		std::cout << "pMyClass == 0" << std::endl; // pMyClass == 0
    
    	pMyClass = 0;
    	if (pMyClass == nullptr)
    		std::cout << "pMyClass == nullptr" << std::endl; // pMyClass == nullptr
    
    	if (pMyClass == 0)
    		std::cout << "pMyClass == 0" << std::endl; // pMyClass == 0
    
    	return 0;
    }
    
    /
    void f(int *)
    {
    	std::cout << "f(int *)" << std::endl;;
    }
    
    void f(int &)
    {
    	std::cout << "f(int &)" << std::endl;
    }
    
    int test_nullptr3()
    {
    	f(nullptr); // f(int *)
    	// try one of the following lines instead
    	f((int *) nullptr); // f(int *)
    	f(0); // f(int *)
    	f(NULL); // f(int *)
    	//f((int &) nullptr); // error C2101: 常量上的“&”
    
    	return 0;
    }
    
    //
    // reference: http://www.cprogramming.com/c++11/c++11-nullptr-strongly-typed-enum-class.html
    void func(int n)
    {
    	std::cout << "func (int n)" << std::endl;
    }
    
    void func(char *s)
    {
    	std::cout << "func (char *s)" << std::endl;
    }
    
    int test_nullptr4()
    {
    	func(0); // func (int n)
    	func(NULL); // func (int n)
    	func(nullptr); // func (char *s)
    
    	return 0;
    }
    
    //
    // reference: http://www.learncpp.com/cpp-tutorial/6-7a-null-pointers/
    void doSomething(int *ptr)
    {
    	if (ptr)
    		std::cout << "You passed in " << *ptr << '\n';
    	else
    		std::cout << "You passed in a null pointer\n";
    }
    
    void doSomething_(std::nullptr_t ptr)
    {
    	std::cout << "in doSomething_()\n";
    }
    
    int test_nullptr5()
    {
    	int* a = NULL; // ok
    	//int* b = (void*)0; // error C2440: “初始化”: 无法从“void *”转换为“int *”
    	int* c = 0; // ok
    
    	// the argument is definitely a null pointer (not an integer)
    	doSomething(nullptr); // You passed in a null pointer
    	doSomething(0); // You passed in a null pointer
    	doSomething(NULL); // You passed in a null pointer
    
    	// call doSomething_ with an argument of type std::nullptr_t
    	doSomething_(nullptr); // in doSomething_()
    
    	return 0;
    }
    

    GitHubhttps://github.com/fengbingchun/Messy_Test

    展开全文
  • nullptr和NULL

    万次阅读 多人点赞 2019-07-17 10:14:44
    nullptr是c++11中的关键字,表示空指针 要区分nullptr和NULL,首先要明白NULL的含义: NULL是一个宏定义,在c和c++中的定义不同,c中NULL为(void*)0,而c++中NULL为整数0 //C语言中NULL定义 #define NULL (void*)0 /...
  • nullptr与NULL

    2020-09-06 16:20:22
    nullptr:c++11引入的关键字,意为“空指针” 案例一观察: char *p = NULL; //一个宏,为0 char *q = nullptr; //通过断点观察p和q,两者都是0x00000000 if (p == q) //条件成立 { cout << "aa" <&...
  • C++中NULL和nullptr的区别

    千次阅读 多人点赞 2019-08-22 19:32:20
    一、C程序中的NULL 在C语言中,NULL通常被定义为:#define NULL ((void *)0) 所以说NULL实际上是一个空指针,如果在C语言中写入以下代码,编译是没有问题的,因为在C语言中把空指针赋给int和char指针的时候,发生...
  • nullptr与null

    2017-03-31 09:41:52
    #ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif #endif在C语言环境下,由于不存在函数重载等问题,直接将NULL定义为一个void*的指针就可以完美的解决一切问题。...
  • NULL与nullptr

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

    千次阅读 多人点赞 2018-09-09 17:03:37
    在过去,我们如果要表示一个指针为空,我们条件反射肯定会这么写: int *p = NULL; 然而啊,有没有想过这是有问题的,比如下面的这段代码: #include &lt;iostream&gt;...this is ...
  • nullptr

    千次阅读 2017-05-19 10:55:28
    如果我们的编译器是支持nullptr的话,那么我们应该直接使用nullptr来替代NULL的宏定义。正常使用过程中他们是完全等价的。 */ #include "stdafx.h" #include #include   using namespace std;   ...
  • nullptr

    2014-03-08 20:06:32
    • In C and ‘old’C++ the null pointer is the preprocessor macro NULL....• C++11 introduces nullptr; A keyword that unambiguously represents a pointer pointing to nowhere. ( std::n
  • nullptr

    2017-11-23 12:19:42
    C++11中添加了nullptr对象,使用 = NULL的时候用nullptr替代,避免二意性问题
  • nullptr

    2010-09-30 23:24:00
    nullptr解决的问题: 例如有两个重载函数 int foo(const char*a); int foo(int a); 如果有代码foo(NULL),按照期望是应该调用第一个函数的,但是由于在C++中NULL被定义成0,所以实际调用...
  • nullptr

    2020-06-09 15:56:23
    文章目录1 nullptr 1 nullptr nullptr是C++11中新引入的关键字,主要用来表示控制针,数据类型为:std::nullptr_t。使用nullptr能够避免在整数和指针之间发生混淆。 首先看一下NULL和nullptr的类型: cout << ...
  • nullptr

    2016-07-21 21:32:00
    关键字nullptr是std::nullptr_t类型的值,用来指代空指针。nullptr和任何指针类型以及类成员指针类型的空值之间可以发生隐式类型转换,同样也可以隐式转换为bool型(取值为false)。但是不存在到整形的隐式类型转换...
  • nullptr

    2014-01-15 15:18:39
    #include void foo(char *) { std::cout (char *)" ; } void foo(int) { std::cout (int)" ; } int main(int argc, char** argv){ char* pc = nul
  • Nullptr 到底是什么?

    2009-08-15 16:47:32
    <p>C++11 corrects this by introducing a new <strong>keyword</strong> to serve as a distinguished null pointer constant: nullptr. It is of <strong>type nullptr_t, which is implicitly convertible and ...
  • Nullptr 到底是什么?

    2009-08-15 16:47:32
    <p>C++11 corrects this by introducing a new <strong>keyword</strong> to serve as a distinguished null pointer constant: nullptr. It is of <strong>type nullptr_t, which is implicitly convertible and ...
  • Nullptr 到底是什么?

    2009-08-15 16:47:32
    <p>C++11 corrects this by introducing a new <strong>keyword</strong> to serve as a distinguished null pointer constant: nullptr. It is of <strong>type nullptr_t, which is implicitly convertible and ...

空空如也

1 2 3 4 5 ... 20
收藏数 84,010
精华内容 33,604
关键字:

nullptr