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
相关产品推荐
相关产品推荐

