在一些讨论中,它声称void *是“指向void对象的指针”,但是在C标准6.5.3.4中,第2点写为: “ sizeof运算符产生的大小(以字节为单位)。...大小由操作数的类型确定。” 因此可以说函数sizeof()接收类型作为参数。
因此,编译器将void *视为类型?或*的使用仅用于语义解释?
答案 0 :(得分:5)
void *
是具有已知大小的有效类型。它指向的对象是类型未知的对象或有效的未类型化内存(即从malloc
返回的内存)。因此sizeof(void *)
是有效的表达式。
6.5.3.4的第1段规定:
sizeof
运算符不得应用于具有以下内容的表达式 函数类型或不完整类型,带括号的名称 ”或指定一个 位域成员。的_Alignof
运算符不得应用于函数类型或不完整类型。
由于void *
不是不完整的类型,因此sizeof(void *)
是有效的。但是,由于void
类型不完整,因此sizeof(void)
无效。
解决您对void **
的评论,这也是指向类型void *
的对象的有效类型。
某些编译器(例如GCC)实现了void
大小为1的扩展,因此sizeof(void) == 1
和void *
上的指针算术以与{{ 1}}。但是,这违反了标准。
答案 1 :(得分:4)
void *
确实是一种类型。 void
也是如此。
void
是无法完成的不完整类型-它代表一组空值。因为它是不完整的类型,所以它可能不是sizeof
运算符的操作数。因此,void
(在逻辑上)没有大小,因此您无法创建void
类型的对象。
void *
是指针类型,因此是完整类型。它充当“通用”指针类型,并且无需转换即可转换为其他指针类型。您不能取消引用void *
,因为结果的类型为void
,并且不能有类型为void
的对象-必须首先将其转换为指向完整类型的指针。
void *
具有与char *
相同的大小和表示形式。