首页 > 解决方案 > 为什么不可能有空数组?

问题描述

我正在浏览 geeksforgeeks,发现我们不能拥有一系列 void 和函数。因为我认为由于函数大小可变(如果我错了,请纠正我)而不允许使用函数数组。

标签: carraysvoid

解决方案


函数根本没有大小;函数不是数据。你也不能有一个单一的“函数变量”。这就是为什么你不能有一个函数数组。

同样,你不能有一个 void 数组,因为你不能有一个 void 类型的元素:

void x;  // what would this do?

(形式上这是一个错误,因为void它是一个不完整的类型(并且它不能完成)。)

void有几个不同的用途(所有这些都属于“非真实类型”的总称):

  • 作为返回类型:void foo(...);

    这表明该函数根本不返回值。

  • 作为参数列表的唯一元素:T foo(void);

    这表明该函数不接受任何参数。从逻辑上讲,您希望 this 的语法是T foo();(一个空的参数列表),但是在没有函数原型的标准 C 中已经有了不同的含义。T foo(void)有点像句法技巧。再次,void标记没有值。

    (C++ 简化了事情。在 C++中,与:不带参数T foo();的意思相同。)T foo(void);foo

  • 作为通用指针类型:void *ptr;

    这意味着ptr是指向某种数据的指针,但我们不知道它是什么。这是语言规则中的一个特例。它不同于其他指针类型,因为

    • 我们不能直接使用它(取消引用指针(如中*ptr)是一个错误,因为你不能有 type 的值void
    • 我们可以将其他(数据)指针类型隐式转换为void *

      int i = 42;
      void *ptr;
      ptr = &i;   // 'int *' -> 'void *'
      
    • 我们可以隐式转换void *为其他(数据)指针类型:

      void *ptr = ...;
      int *pi;
      pi = ptr;  // 'void *' -> 'int *'
      

    因此,它void *被用作一般的“指向未知类型值的指针”。


推荐阅读