我们知道,在c语言中,是没有nullptr这个概念的,你可以使用NULL或者0来表示空指针。也就是说,c语言中的0和NULL是等价的。这是因为c语言中NULL是一个宏,被定义为了(void*)0。
#define NULL (void*)0
char *p = NULL;
在上述代码块中,定义了一个字符指针p,并把它初始化为空,这是可行的。因为void * 类型可以转换为其他任何的指针类型 (把void指针转换成相应类型的指针)。
而c++中的NULL虽然也是一个宏,但并不是和c语言中一样被定义为了(void *)0,c++中的NULL定义如下代码所示:
#define NULL 0
char *p = NULL;
char *p = nullptr;
可见,在c++中,NULL是被定义成了数字0的,为什么会这样呢?
这是和c++这种语言的特点有关的。
c++相对于c语言而言,是一种类型安全的语言,在c++中进行赋值和传参的时候,会进行严格的类型校验,所以如果还和c语言中对NULL那样定义的话,由于c++类型安全的特点,将NULL赋值给别的指针变量类型时就会出现编译错误,所以解决方案是把它定义为0。这样的话,char *p = NULL的时候才不会出错。
然而这样就又会引入一个新的问题,就是造成二义性的问题,比如下面的两个函数声明:
void func(int);
void func(char*);
上面是两个重载函数,一个形参是int类型,一个是字符指针类型。当调用func(NULL)的时候,它会去调用void func(int) , 然而我们是把NULL当做了空指针,显然是希望它能够执行void func(char*)的,所以这是不合理的。
为了解决上述的问题, c++11引入了nullptr,即专门用来区分0和NULL。
nullptr的类型为nullptr_t,不是整数类型, 能够隐式的转换为任何指针。所以用空指针的时候推荐使用nullptr。
总结:在c++中,NULL和nullptr都可以实现把一个指针置为空的操作,但是在有的时候使用NULL会出错(如上所描述),所以建议使用c++编程的时候,都使用nullptr而不是NULL,这样就保证了不会出错!

1638

被折叠的 条评论
为什么被折叠?



