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作为空指针

注意

  1. 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的
  2. C++11中,sizeof(nullptr)sizeof((void*)0)所占的字节数相同