NULL实际是一个宏,在传统的C头文件(stddef.h)中,可以看到如下代码:
可以看到,
NULL
可能被定义为字面常量
0
,或者被定义为无类型指针
(void*)
的常量
。不论采取何种定义,在
使用空值的指针时,都不可避免的会遇到一些麻烦,比如:
void f(int)
{
cout<<"f(int)"<<endl;
}
void f(int*)
{
cout<<"f(int*)"<<endl;
}
int main()
{
f(0);
f(NULL);
f((int*)NULL);
return 0;
}
程序本意是想通过
f(NULL)
调用指针版本的
f(int*)
函数,但是由于
NULL
被定义成
0,因此与程序的初衷相悖。
在
C++98
中,字面常量
0
既可以是一个整形数字,也可以是无类型的指针
(void*)
常量,但是编译器默认情况下
将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转
(void *)0
。
![](https://i-blog.csdnimg.cn/blog_migrate/8df3c27af51eea052c9cf26bb15dfaac.png)