我差不多完成了我的C Primer Plus书,我即将参加结构和工会等等......但是我仍然没有完全掌握关键词void是什么。无效的是什么?它是如何工作的?我什么时候应该使用它?
我理解
void function(void)
基本上说没有回报价值。没有争论。 我知道你可以使用不同的场景,
int function(void); //has a return of type int -- voids args
void function(int); //voids return type -- takes type int as an arg
我也理解
void * p = 0L;
是有效的代码,它基本上是一个指向void的指针,初始值为0。
但是以这种方式使用它是否有任何价值或目的
void k = 0;
或者我只是排除了数据类型?如果是这样,排除数据类型是否有用? 因为从我能够推断的内容来看,它在功能和工作指针方面非常有用 具有不可确定的数据类型,例如
size_t fwrite(const void * restrict ptr, ...more args...);
由于第一个参数不是固定类型,我的书将其描述为“指针的类型”,并且“Pre-ANSI C对此参数使用类型 char * ,这需要你要对该类型的实际参数进行类型转换“。
这是否意味着我可以使用任何数据类型? 如果是这样,这仅限于指针和功能仅?
再次......我不关心如何将int转换为void。我并不关心指向无效的指针,而只关注如何有效地使用这个关键字。我关心的是“我什么时候应该使用它?”和“我该如何使用它?”。
提前感谢您的任何答案。
答案 0 :(得分:6)
以这种方式使用它是否有任何价值或目的
void k = 0;
不,该声明没有任何意义,编译器会抱怨不完整的类型。请注意,每当您在类型声明中看到void
时,它后跟一个指示指针的*
,如:
void *foo = nil;
在这种情况下,您告诉编译器foo
是一个指针,这是创建foo
时真正需要知道的全部内容。如果没有*
,您就会尝试声明一个没有类型的变量,并且这不是编译器(或者人类)可以使用的东西。
因为第一个参数不是固定类型,所以我的书将其描述为指针的一个类型" catchall类型"
第一个参数是 a"固定类型" - 类型是指针。确实指出指针指向的类型是未指定的,但参数本身是一个指针。
这是否意味着我可以使用任何数据类型?
您可以将指针用于任何类型的数据。 fwrite()
获取指向某种类型对象的数组的指针,以及该类型的大小,对象的数量和指向文件的指针,并将这些对象写入文件。 fwrite()
并不关心对象的类型,但由于它没有任何类型信息,因此您需要明确传递大小和数字。
答案 1 :(得分:3)
使用void
类型有三种基本情况。可能还有其他一些边缘情况,但这三个是您使用void
的地方,可能是99%的时间。
通过记住" void"有助于理解这一点。意味着"这里没有类型",如"数据类型"。
1)声明一个不返回值的函数,而不是返回某个值的函数。
2)声明一个不带参数的函数,而不是带有一个或多个参数的函数。
3)"指向void"情况。
第三种情况基本上定义了一个通用指针。指向某事物的指针,但是这个"东西"在处理指针的代码部分中并不重要。
例如,这是memcpy
函数()的手册页:
MEMCPY(3) Linux Programmer's Manual MEMCPY(3)
NAME
memcpy - copy memory area
SYNOPSIS
#include <string.h>
void *memcpy(void *dest, const void *src, size_t n);
DESCRIPTION
The memcpy() function copies n bytes from memory area src to memory
area dest. The memory areas must not overlap. Use memmove(3) if the
memory areas do overlap.
您可以自己阅读本手册的其余部分。 memcpy()需要几个指针来指定要复制的内存块。 memcpy()并不关心指针指向的内容。它不需要知道,所以它的函数原型指定任何指针都可以传递给它。指向int
,指向char
的指针或指向某个类实例的指针。