【问题标题】:What exactly is type void and how does it work?什么是类型 void 以及它是如何工作的?
【发布时间】:2014-11-15 22:52:06
【问题描述】:

我几乎完成了我的 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 long。

但是以这种方式使用它有什么价值或目的

void k = 0;

或者我只是在取消数据类型?如果是这样,取消数据类型有什么用处吗? 因为据我所知,它在函数和工作指针中非常有用 具有不可定义的数据类型,例如

size_t fwrite(const void * restrict ptr, ...more args...);

由于第一个参数不是固定类型,我的书将其描述为“指针的笼统类型”,并且“Pre-ANSI C 对此参数使用类型 char *,这需要您可以将实际参数类型转换为该类型”。

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

再次...我不关心如何将 int 转换为 void。我不关心指向无效的指针是否有效,而只关心如何有效地使用这个关键字。我担心“我应该什么时候使用它?”和“我应该如何使用它?”。

提前感谢您的任何回答。

【问题讨论】:

    标签: c pointers types void void-pointers


    【解决方案1】:

    以这种方式使用它有什么价值或目的

    void k = 0;

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

    void *foo = nil;
    

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

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

    第一个参数一个“固定类型”——类型是一个指针。确实指针指向的类型是未指定的,但参数本身就是一个指针。

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

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

    【讨论】:

    • 谢谢。我的书没有详细说明。这有助于从我对这些数据类型可能发生的情况的理解中澄清一些缺失的细节。还有助于提醒指针是一种类型,这是不断从我的记忆中滑落的东西。感谢您帮助 C 新人。这是我的第一个“真正的编程语言”,我在努力学习尽可能多的基本概念。
    【解决方案2】:

    在三种基本情况下使用void 类型。可能还有其他一些边缘情况,但在这三种情况下你会看到void 被使用,可能有 99% 的时间。

    记住“void”的意思是“这里没有类型”有助于理解这一点,就像在“数据类型”中一样。

    1) 声明一个不返回值的函数,而不是返回一些值的函数。

    2) 声明一个不带参数的函数,而不是带一个或多个参数的函数。

    3) “指向无效”的情况。

    第三种情况基本上定义了一个通用指针。指向...某物的指针,但这个“某物”在处理指针的代码部分中并不重要。

    例如,这里是memcpy function() 的手册页:

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

    【讨论】:

    • 谢谢。这有助于澄清 caleb 上面所说的内容。
    猜你喜欢
    • 1970-01-01
    • 2020-08-06
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-14
    • 2014-01-09
    相关资源
    最近更新 更多