请求详解nullptr、字面量'0'、NULL、(void*)0与'\0'之间的差异
拆解 nullptr、'0'、NULL、(void*)0 和 '\0' 的区别
嘿,这个问题问到点子上了!很多刚摸C/C++的朋友都会把这些玩意儿搞混,我给你逐个扒清楚:
1. nullptr:C++11 带来的类型安全空指针
这是C++11专门为解决空指针歧义引入的强类型空指针常量,它的类型是std::nullptr_t,既不是整数,也不是普通指针。
- 核心优势就是类型安全:比如你有两个重载函数
void func(int)和void func(char*),传NULL会匹配int版本,但传nullptr会精准命中指针版本,完全不会搞混。 - 现在写C++代码,优先用它就对了,别再踩NULL的坑。
2. NULL:跨C/C++的宏定义空指针
这是个宏,不同环境下的定义有点区别:
- 在C语言里,
NULL通常被定义为(void*)0,因为C允许void*隐式转换成其他指针类型,用起来没毛病。 - 但在C++里,因为类型检查更严格,
NULL一般被定义为0或者0L(长整数0)。这就导致了歧义问题——当重载函数有整数和指针版本时,传NULL会优先匹配整数,完全不是你想要的空指针效果。 - 总结:C里用它没问题,C++里尽量换成
nullptr。
3. (void*)0:C风格的显式空指针
这是把整数0强制转换成void*类型的结果,是C语言里最“原汁原味”的空指针写法。
- 在C里,直接写
0也能被当作空指针,但显式写成(void*)0更明确,能让读代码的人一眼知道这是个指针,不是普通整数。 - 到了C++里,
void*不能隐式转换成其他类型的指针(比如char*),必须显式转换,所以用起来不如nullptr方便,还容易出错。
4. '0':字符字面量“0”
这个和空指针半毛钱关系都没有!它是字符类型的字面量,对应的ASCII值是48,就是你在屏幕上看到的那个数字字符“0”。
- 比如你写
char c = '0';,变量c里存的是48,不是0,别搞混了。它主要用来表示字符串里的数字字符,比如"1230"里的最后一个字符就是它。
5. '\0':字符串结束符(空字符)
这是空字符,ASCII值是0,类型是char。它唯一的用途就是标记C风格字符串的结束位置。
- 比如你定义
char str[] = "hello";,编译器会自动在末尾加一个'\0',这样strlen()这类函数才知道什么时候停止计数。 - 注意:它的数值和整数0相同,但类型是
char,和0(int类型)、nullptr(指针类型)完全不是一回事。
一句话总结差异表
| 标识符 | 类型 | 用途 |
|---|---|---|
nullptr | std::nullptr_t | C++类型安全空指针 |
NULL | 宏(C为void*,C++为int/long) | 跨C/C的空指针兼容写法(C慎用) |
(void*)0 | void* | C风格显式空指针 |
'0' | char | 字符“0”(ASCII 48) |
'\0' | char | C风格字符串结束符(ASCII 0) |
内容的提问来源于stack exchange,提问作者user18324455




