在C中是无效的数据类型?

suh*_*hel 50 c types void

voidC编程语言中的数据类型吗?如果是这样,它可以存储什么类型的值?如果我们有int,float,char,等,来存储值,为什么void需要?

Jam*_*ran 78

Void被认为是一种数据类型(出于组织目的),但它基本上是一个用作占位符的关键字,您可以在其中放置数据类型来表示"无数据".

因此,您可以声明一个不返回值的例程:

void MyRoutine();
Run Code Online (Sandbox Code Playgroud)

但是,你不能声明这样的变量:

void bad_variable;
Run Code Online (Sandbox Code Playgroud)

但是,当用作指针时,它具有不同的含义:

void* vague_pointer;
Run Code Online (Sandbox Code Playgroud)

这声明了一个指针,但没有指定它指向的数据类型.

  • 并且由于您没有指定void指针指向的内容,因此您无法对其执行数学运算.编译器不知道将指针移动多远到达内存中的下一个项目. (12认同)
  • @fennec:如果你正在使用gcc,你可以对`void*`值执行算术运算,它通过假装`sizeof(void)== 1`来支持它作为扩展.(我个人认为这很不幸.) (5认同)
  • `void MyRoutine();`是C99弃用的旧式(K&R C)函数声明,而不是原型.这应该是`void MyRoutine(void);`而不是. (4认同)
  • @AnT:一个不完整的struct类型没有*all*与`void`相同的属性.它们都是不完整的类型,但是例如所有指针到结构类型都具有相同的表示形式; `void*`可能有也可能没有相同的表示.此外,可以完成不完整的结构类型; `void`不能. (2认同)

Kei*_*son 24

是的,void是一种类型.它是否是数据类型取决于您如何定义该术语; C标准没有.

该标准确实定义了术语"对象类型".在C99及更早版本; void不是对象类型; 在C11中,它是.在该标准的所有版本中,void都是不完整的类型.C11中改变的是,不完整类型现在是对象类型的子集; 这只是术语的变化.(另一种类型是函数类型.)

C99 6.2.6第19段说:

所述空隙类型包括一个空的一组值; 它是一种不完整的类型,无法完成.

C11标准稍微改变了措辞:

所述空隙类型包括一个空的一组值; 它是一个不完整的对象类型,无法完成.

这反映了C11在"对象类型"定义中的变化,包括不完整类型; 它并没有真正改变任何类型的性质void.

void关键字,也可以在其他一些情况下使用:

  • 作为函数原型中唯一的参数类型,如同int func(void),它表示该函数没有参数.(C++为此使用空括号,但它们在C中表示其他内容.)

  • 作为函数的返回类型,如void func(int n),表示该函数不返回任何结果.

  • void* 是指针类型,不指定它指向的内容.

原则上,所有这些用法都指的是类型 void,但您也可以将它们视为恰好使用相同关键字的特殊语法.

  • @funky-nd:再看一遍我怀疑你是想问 `int func()` 和 `int func(void)` 之间的区别。不同之处在于后者是一个*prototype*,它指定函数不接受任何参数。前者是一个老式的函数声明,它没有指定它期望的参数。(很少有充分的理由使用旧式函数声明。) (3认同)

Jen*_*ens 5

C标准说这void是一个不完整的类型,不能完成(不同于其他可以完成的不完整类型).这意味着您无法应用sizeof运算符void,但您可以指向不完整的类型.