前言
C语言中的NULL,C++中的NULL,以及c11–nullptr
1.NULL在C和C++中
在C语言中,NULL是将0值强转成无类型指针((void*)0),是0值,类型是无类型指针
在C++中,NULL就是0值
1.1 下面代码是在C语言中
C语言中的NULL
int main()
{
int a = 10;
void* vp = &a;
int* ip = vp;//在C中可以把无类型指针向其他类型指针赋值,发生隐式转换,进行强转
char* cp = vp;;
}
1.2 下面代码是在C++中
C++中的NULL
int main()
{
int a = 10;
void* vp = &a;
int* ip = vp;//error,C++中类型约束要比C强,必须手动进行强转,
char* cp = vp;//error
//如果按C中规则,NULL是无类型指针,在C++需要下面这种,
int* p = (int*)NULL;//int* p=(int*)((void*)0)
//因此在C++中,NULL就是0值,向其他类型指针直接赋值
int* p = NULL;
char* p = NULL;
}
1.3 c11–nullptr
nullptr可以给一切指针类型进行赋值,都可以进行隐式转换
代码如下(示例):
void fun(int a)
{
cout << "fun(int a)" << endl;
}
void fun(char* p)
{
cout << "fun(char* p)" << endl;
}
int main()
{
fun(0);
fun(NULL); //fun(0) C++中原有NULL容易和整型值发生二义性,所以给出了指针空值类型
fun(nullptr);//指针空值类型
return 0;
}
int main()
{
int* p = nullptr;
//nullptr = 0;error
//int a = nullptr; //nullptr=指针空值类型 a=int nullptr是指针空值类型的0值,不是整型的0值,类型不一样
}
总结
- nullptr是c11引入的关键字,是一个所谓“指针空值类型”的常量,在C++程序中使用
- 在C11中,sizeof(nullptr)与sizeof((void*)0)所占的字节相同(4或8)
- 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr