You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

请求详解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(指针类型)完全不是一回事。

一句话总结差异表

标识符类型用途
nullptrstd::nullptr_tC++类型安全空指针
NULL宏(C为void*,C++为int/long跨C/C的空指针兼容写法(C慎用)
(void*)0void*C风格显式空指针
'0'char字符“0”(ASCII 48)
'\0'charC风格字符串结束符(ASCII 0)

内容的提问来源于stack exchange,提问作者user18324455

火山引擎 最新活动