C语言和C++中的空指针区别
C语言中,空指针是NULL
,是一个宏
在C++中NULL
似乎也可以用,但是C++中的NULL
其实是有问题的。C++大佬在设计的时候可能没有考虑全面
在C++98中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量
但是编译器默认情况下 将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void *)0。
看一下在C++中NULL
的定义
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
可以看到,NULL
在C++中其实就是 0
在C语言中才是(void*)0
,即空指针
所以C++如果用NULL
做空指针,就会出现这种情况
//f函数构成函数重载
void f(int)
{
cout<<"f(int)"<<endl;
}
void f(int*)
{
cout<<"f(int*)"<<endl;
}
int main()
{
int* p = NULL;
f(NULL);//调用 f(int)
f(0);// 调用f(int)
f(p);// 调用f(int*)
/* 显然,f(NULL)我们本想调用 f(int*)
但是却调用成了 f(int) */
return 0;
}
所以为了补C++的坑,C++11中引入了nullptr
作为空指针
注意
- 在使用
nullptr
表示指针空值时,不需要包含头文件,因为nullptr
是C++11作为新关键字引入的 - C++11中,
sizeof(nullptr)
与sizeof((void*)0)
所占的字节数相同
热门相关:抗日之特战兵王 陆爷的小祖宗又撩又飒 诛明 霍先生结婚吧 霍先生结婚吧