【C++】null与nullptr
总结:
1、c++中null定义为int 0(C中是void *);
2、nullptr并非整型类别,甚至也不是指针类型,但是能转换成任意指针类型。nullptr的实际类型是std:nullptr_t。
3、c++中null具有int 和void*的二义性,在调用同时具有这两种重载函数的时候会出错
https://zhuanlan.zhihu.com/p/79883965
前言
在C语言中,我们常常用NULL作为指针变量的初始值,而在C++中,却不建议你这么做。
NULL是什么
在《NULL,0,'\0',"0","\0"的区别》一文中,我们已经知道了在C中NULL是什么,在C的头文件中,通常定义如下:
#define NULL ((void*)0)
但是在C++中,它是这样定义的:
#define NULL 0
或者你可以在stddef.h看到完整的这段:
#undef NULL
#if defined(__cplusplus)
#define NULL 0
#else
#define NULL ((void *)0)
#endif
也就是说,在C++中,NULL不过也是0罢了,把它当成空指针只是一个无可奈何的选择罢了。
那么为什么在C++和C中不一样呢?因为C++中不能将void *类型的指针隐式转换成其他指针类型,从下面的例子可以看出来:
//null.cpp
#include<iostream>
int main(void)
{
char p[] = "12345";
int *a = (void*)p;
return 0;
}
编译:
$ g+ -o null null.cpp
null.cpp: In function 'int main()':
null.cpp:5:17: error: invalid conversion from 'void*' to 'int*' [-fpermissive]
int *a = (void*)p;
所以不能将NULL定义为(void*)0。
nullptr
nullptr并非整型类别,甚至也不是指针类型,但是能转换成任意指针类型。nullptr的实际类型是std:nullptr_t。
来源:公众号【编程珠玑】,https://www.yanbinghu.com
为什么该使用nullptr
回到最开始的问题,为什么作为指针的语义,我们应该使用nullptr,而不是NULL。
请看下面的代码:
//来源:公众号【编程珠玑】,https://www.yanbinghu.com
//test.cpp
#include<iostream>
using namespace std;
void test(void *p)
{
cout<<"p is pointer "<<p<<endl;
}
void test(int num)
{
cout<<"num is int "<<num<<endl;
}
int main(void)
{
test(NULL);
return 0;
}
编译:
$ g++ -o test test.cpp
main.cpp: In function ‘int main()’:
main.cpp:16:14: error: call of overloaded ‘test(NULL)’ is ambiguous
test(NULL);
很不幸,编译报错了,提示我们有二义性,按照《重载函数匹配规则》,两个都可以匹配,因此最终报错。
但是如果我们使用nullptr却不会:
test(nullptr);
除了这点之外,在C++模板中它还有更好的表现。
看下面的代码:
//来源:公众号【编程珠玑】,https://www.yanbinghu.com
#include<iostream>
using namespace std;
template<typename Type1,typename ptrType>
void test(Type1 fun,ptrType ptr)
{
/*do something*/
fun(ptr);
return;
}
void fun(int *val)
{
cout<<"fun"<<endl;
}
int main(void)
{
test(fun,NULL);
return 0;
}
编译报错了:
main.cpp:8:8: error: invalid conversion from ‘long int’ to ‘int*’ [-fpermissive]
fun(ptr);
很显然NULL被推导为long int,而不是空指针,因而导致函数类型不匹配而报错。
但是如果我们用nullptr就不会有上面的问题。
总结
如果你想表示空指针,那么使用nullptr,而不是NULL。
注:nullptr在C++ 11中才出现。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异