You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中(void *)0是否为void指针?void* pointer=NULL的类型定义问询

空指针与void指针的定义辨析

依据C语言标准ISO/IEC 9899:201x §6.3.2.3-3:若指针与常量字面量0比较,是检查该指针是否为空指针,此0被称为空指针常量。C标准定义,强制转换为void*类型的0既是空指针也是空指针常量。而(void *)0是指向void的地址(此上下文下非法),通常这类地址可转换为其他指针类型并解引用,但此处即使转换后也不可解引用。

Q1:按定义,(void *)0能被称为void指针吗?

答案是肯定的,但要明确它的双重身份:

  • 从类型维度看,(void *)0的类型就是void*,所以它本质上就是一个void指针。
  • 从值的属性看,它同时是C标准规定的空指针常量——这是它的特殊之处。标准明确说明,被转换为void*的0既是空指针也是空指针常量,所以它是一个空的void指针。不过要记住,这个指针指向的地址是非法的,无论转换为哪种指针类型,都绝对不能解引用。

总结一下:(void *)0属于void指针的范畴,是带有空指针常量属性的空void指针。

Q2:代码void *pointer = NULL;中的变量,该叫void指针、空指针还是空void指针?

这三种说法都正确,只是侧重点不同:

  • 若强调变量类型:它是一个void指针(因为声明时明确指定了void*类型)。
  • 若强调变量的值状态:它是一个空指针(因为NULL是空指针常量,赋值后变量持有空指针的值)。
  • 若需要最精确的表述:可以称它为空void指针,既点明了类型是void*,又清晰说明它的空指针状态。

日常开发沟通中,只要语境明确,说“空指针”完全没问题;但如果需要避免歧义(比如在讨论不同类型指针的空值区别时),用“空void指针”会更严谨。


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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 16:42:44