void / void *声明行为

时间:2014-11-19 08:23:51

标签: c void void-pointers

计划1:

int main()
{
    void v=8;
    printf("v=%d\n",v);
}

计划2:

int main()
{
    void *v=8;
    printf("*v=%u\n",*v);
    printf("v=%u\n",v);
}

程序1的编译错误:

**error**: variable or field ‘v’ declared void void v=0;

程序2的编译错误:

**error**:invalid use of void expression printf("%d\n",*v);

有人知道上述程序代码中voidvoid*的行为吗?

2 个答案:

答案 0 :(得分:2)

void有两个用途:

  • 作为函数声明的一部分,声明函数不返回任何内容,或者不带任何参数。

  • 或者作为通用指针类型void*,可用于转换为/从任何其他指向类型的指针,而无需显式转换。

C11 6.2.5 / 19指出:

  

void类型包含一组空值;这是不完整的   无法完成的对象类型。

这意味着您无法将变量定义为void,也无法取消引用void*

6.3.2.2

中更清楚地说明了这一点
  

6.3.2.2 void

     

void表达式的(不存在的)值(具有的表达式)   type void)不得以任何方式使用,也不得使用隐式或显式   转换(无效除外)不适用于此类转换   表达。如果任何其他类型的表达式被评估为void   表达式,其值或指示符被丢弃。 (无效表达   评估其副作用。)

答案 1 :(得分:-1)

虚空*只是一个指向你不知道的东西的指针。 所以你可以初始化ist。即使void *也不是很有用,但它是一个指针,可以转换为特定类型的指针。

虚空变量是"你不知道的东西"因此它永远不会被初始化并且不能被声明。