【问题标题】:Given that void is an empty type, why is void* a pointer type which can point to an object of any type?既然 void 是一个空类型,为什么 void* 是一个可以指向任何类型对象的指针类型?
【发布时间】:2017-08-24 02:39:25
【问题描述】:

在 C 中,void 是没有任何值的类型,即空类型。

按照void的意思,void*应该是一个指向空的指针,而void*实际上是一个指针类型,可以指向任何类型的对象。

我在这里误解了什么吗?

【问题讨论】:

  • 因为 C 标准是这么说的。
  • voidvoid * 的规则是特殊情况。 void 是无法完成的不完整类型。 void * 是指向不确定类型的指针。您不能直接使用它来取消引用数据;您必须先将其转换为指向完整类型的指针,然后才能执行此操作。
  • 我认为这背后不需要任何真正的逻辑:创建者认为通用指针类型很方便,所以他们选择了void*,因为它最符合目的。
  • 起初是地球,地球是无形的,void *。我会展示自己的。
  • 您对一般问题的痴迷是什么?你真的想知道这一切还是只是想收集点赞?

标签: c


【解决方案1】:

您可以将void * 视为“指向我们不知道其类型的对象的指针”,而不是“指向任何类型对象的指针”。它基本上是一个没有任何类型信息的指针,void 可以表示缺少类型。

【讨论】:

    【解决方案2】:

    编译器不需要关于类型的所有信息来相互分配指针,也不需要任何信息来定义结构成员或将此类指针作为参数传递给函数,原因可能是清楚,所有指针的大小都相同。

    当程序试图读取或写入底层数据——指针实际指向的数据时,它需要所有类型的信息来执行指针运算。所以它基本上需要知道指针指向的结构成员的偏移量是多少,或者当您需要取消引用它时ptr[3] 的确切位置。它需要计算此类偏移量所需的信息。

    由于编译器对于上述操作并不真正需要指针的类型,因此指针可以没有类型,因此void * 是此类指针的“类型”。但请注意,您需要一个实际类型才能对它进行任何有用的操作。

    【讨论】:

      猜你喜欢
      • 2013-10-24
      • 2012-11-24
      • 2011-12-18
      • 1970-01-01
      • 1970-01-01
      • 2019-05-04
      • 2013-05-18
      • 2017-04-22
      • 2011-12-18
      相关资源
      最近更新 更多