【问题标题】:How does a function with a void array pointer argument know the size of array elements?带有 void 数组指针参数的函数如何知道数组元素的大小?
【发布时间】:2020-05-20 22:25:42
【问题描述】:

K&R 的第 121 页列出了以下用于交换两个数组元素的函数:

void swap(void *v[], int i, int j)
{
    void *temp;

    temp = v[i];
    v[i] = v[j];
    v[j] = temp;
}

我不明白当数组没有类型时如何对数组进行索引。

据我所知,类型在运行时不存在,并且无法保证此函数会与使用它的代码一起编译。

当一个包含任意大小值的数组可以传递给它时,这个函数如何正确地执行数组索引呢?

换句话说,如果我将long 数组传递给这个函数,它怎么知道v[i] 将位于v + sizeof(long) * i,而它不知道数组的类型?

【问题讨论】:

  • 它与void swap(long x[], int i, int j) 相同,除了void* 而不是long。您不能将long 数组传递给问题中的函数

标签: c pointers void


【解决方案1】:

数组确实有一个类型。它是一个void * 的数组,而void * 是一个完全定义的类型,与void 不同。

所以这个函数正在做的是交换数组中的一对void *

如果将v 定义为void * 而不是void *[],那么您将遇到问题。

【讨论】:

  • 啊,我明白了。 void *v[] 是 void 指针数组,而不是指向 void 数组的指针。
猜你喜欢
  • 1970-01-01
  • 2013-09-05
  • 2023-02-25
  • 1970-01-01
  • 2017-09-05
  • 1970-01-01
  • 2021-05-09
  • 1970-01-01
  • 2018-08-25
相关资源
最近更新 更多