带有 void 数组指针参数的函数如何知道数组元素的大小?
How does a function with a void array pointer argument know the size of array elements?
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[i]
位于 v + sizeof(long) * i
数组?
数组 有类型。它是一个 void *
的数组,而 void *
是一个完全定义的类型,不像 void
.
所以这个函数所做的是交换数组中的一对void *
。
如果 v
被定义为 void *
而不是 void *[]
,那么你就会遇到问题。
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[i]
位于 v + sizeof(long) * i
数组?
数组 有类型。它是一个 void *
的数组,而 void *
是一个完全定义的类型,不像 void
.
所以这个函数所做的是交换数组中的一对void *
。
如果 v
被定义为 void *
而不是 void *[]
,那么你就会遇到问题。