20170606_NULL和nullptr的区别与联系
参考:http://www.cnblogs.com/denggelin/p/5663080.html
1、空指针,null pointer,不指向任何对象,在试图使用一个指针之前必须要检查这个指针是不是空指针。
2、举例子:
int *p1=nullptr; 等价于: int *p1=0; // 直接将 p1 初始化为字面值常量 nullptr 或者 字面值常量 0。
int *p2=NULL; 等价于:int *p2=0;
int *p3=0;
3、NULL 是一个预处理器变量,在头文件 cstdlib 中定义为 0 值。预处理器是运行在编译过程之前的一段程序,预处理变量不属于命名空间 std,它是由预处理器负责管理。当用到一个预处理变量时,在编译时,预处理器会自动把它替换为实际值,因此使用 NULL 初始化指针和使用 0 初始化指针是一样的。
nullptr 是一个字面值常量,它可以被转化为任何其他类型的指针。
另外,把int 型变量直接赋值给指针是错误的操作,即使int 型变量等于0 也不行!
int zero=0; int *p=zero; (错误,不能把int 型变量直接赋值给指针!)
1、测试1:
#include
using namespace std;
void go(int num)
cout<<"go num"<
2、测试2:( NULL是0。nullptr是空指针void*。)
#include
using namespace std;
void go(int num)
cout<<"go num"<
3、在强调一下,NULL 在C++中的定义仅仅是 0,仅此而已。
4、参考:http://www.cnblogs.com/malecrab/p/5569707.html
(1)引出话题:
有人喜欢使用NULL作为空指针常量使用,例如:int* p = NULL;
也有人直接使用0值作为空指针常量,例如:int* p = 0;
前者可能觉得:NULL作为空指针常量,名字很形象,可读性较强。后者可能觉得:NULL并不是C/C++语言的关键字,而是一个在
标准库头文件
(2)NULL是一个宏,在C/C++标准中,它的值只一个空指针常量(null pointer constant)。
而在C语言中,常数0 和(void *)0 都是空指针常量。C++中(暂且忽略C++11新标准),常数0 是,但(void *)0 不是。
以GCC的宏定义为例:
#if defined(__cplusplus)
# define NULL 0 // C++中使用0作为NULL的值
#else
# define NULL ((void *)0) // C中使用((void *)0)作为NULL的值
#endif
(4)C++11中为什么要引入nullptr?
考虑着这样一个函数重载的情形:
#include
void foo(int) {} // #1
void foo(char*) {} // #2
int main()
{
foo(NULL); // 调用#1还是#2?
return 0;
}
void foo(int) {} // #1
void foo(char*) {} // #2
int main()
{
foo(nullptr); // 它会毫无异议地调用#2
return 0;
}
再简化一点就是
void f(int i){
cout << "take integer" << endl;
}
void f(int *p){
cout << "take pointer" << endl;
}
调用f(NULL)
gcc编译会提示重载歧义
调用f(nullptr)一切正常
结论: 如果使用 nullptr 初始化对象,就能避免 0 指针的二义性的问题。