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

时间:2014-09-22 03:05:54

标签: c pointers types void void-pointers

我差不多完成了我的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。我并不关心指向无效的指针,而只关注如何有效地使用这个关键字。我关心的是“我什么时候应该使用它?”和“我该如何使用它?”。

提前感谢您的任何答案。

2 个答案:

答案 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的指针或指向某个类实例的指针。