什么类型无效,它是如何工作的?

4 c types pointers void void-pointers

我差不多完成了我的C Primer Plus书,我即将参加结构和工会等等......但是我仍然没有完全掌握关键词void的确切含义.无效的是什么?它是如何工作的?我什么时候应该使用它?

我明白那个

void function(void)
Run Code Online (Sandbox Code Playgroud)

基本上说没有回报价值.没有争论.我知道你可以使用不同的场景,

int function(void); //has a return of type int -- voids args
void function(int); //voids return type -- takes type int as an arg
Run Code Online (Sandbox Code Playgroud)

我也明白这一点

void * p = 0L;
Run Code Online (Sandbox Code Playgroud)

是有效的代码,它基本上是一个指向void的指针,初始化值为0 long.

但是以这种方式使用它是否有任何价值或目的

void k = 0;
Run Code Online (Sandbox Code Playgroud)

或者我只是排除数据类型?如果是这样,排除数据类型是否有用?因为从我能够推断的,它在函数和指针中非常有用,用于处理不可确定的数据类型,例如

size_t fwrite(const void * restrict ptr, ...more args...);
Run Code Online (Sandbox Code Playgroud)

因为第一个参数不是固定类型,我的书将其描述为"指针的类型",并且"Pre-ANSI C 对此参数使用类型char*,这要求您对该类型的实际参数进行类型转换".

这是否意味着我可以使用任何数据类型?如果是这样,这是仅限于指针和功能

再次......我不关心如何将int转换为void.我并不关心指向无效的指针,而只关注如何有效地使用此关键字.我关心的是"我什么时候应该使用它?" 和"我该如何使用它?".

提前感谢您的任何答案.

Cal*_*leb 6

以这种方式使用它是否有任何价值或目的

void k = 0;

不,该声明没有任何意义,编译器会抱怨不完整的类型.请注意,每当您void在类型声明中看到使用时,它后跟一个*指示指针的指针,如:

void *foo = nil;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您告诉编译器这foo是一个指针,这实际上是创建它需要知道的全部内容foo.没有*,你试图声明一个没有类型的变量,而这不是编译器(或者人类)可以使用的东西.

由于第一个参数不是固定类型,我的书将其描述为"指针的类型"

第一个参数 "固定类型" - 类型是指针.确实指针指向的类型是未指定的,但参数本身是指针.

这是否意味着我可以使用任何数据类型?

您可以使用指向任何类型数据的指针.fwrite()获取指向某种类型对象的数组的指针,以及该类型的大小,对象的数量和指向文件的指针,并将这些对象写入文件.fwrite()不关心对象的类型,但由于它没有任何类型信息,您需要显式传递大小和数字.

  • 谢谢.我的书没有详细介绍.这有助于澄清我对这些数据类型可能发生的事情的理解中遗漏的一些细节.同样有必要提醒一下,指针是一种类型,这是一种不断从我的记忆中滑落的东西.感谢帮助C新人.这是我的第一个"真正的编程语言",我试图在我进一步学习的过程中尽可能多地理解基本概念. (2认同)