根据您的标题,您需要一个函数,该函数接受其元素类型对该函数未知的数组。没有这样的函数,因为在 C 中永远没有数组作为函数参数传递。相反,如果指定函数参数的表达式计算结果为数组,则该数组进一步“衰减”为指向数组的第一个元素,它是传递的指针。实际上,几乎在所有上下文中,数组都会衰减为指针。
不要上当:C 允许您通过在其他地方指定数组的语法来指定函数参数类型,但这是一个方便的特性。以这种方式指定的实际参数类型是相应的指针类型。如果您愿意,这允许您编写匹配的变量和函数参数声明。
现在,由于传递的不是未知(函数)类型的数组,而是指向此类数组的第一个元素的指针,因此您的问题归结为“我如何指定一个指针类型可以持有指向任何类型的指针?”我打赌你已经知道了:void * 是传统方式,但char * 也可以:
void f(void *a) {
// ...
}
但是,仅凭这一点您无能为力。与标准库函数qsort() 的接口相比,它确实只接受这样的指针。为了能够使用指针,它还接受指定每个数组元素的大小和元素数量的参数,并且出于其特定目的,它还接受指向适合比较这些元素的函数的指针。
更新:
按照qsort() 模型,如果你想要一个打印任何数组元素的函数,你可以这样做:
void print_elements(void *first, size_t element_size, size_t element_count,
void (*print_element)(void *)) {
char *element = first; // pointer arithmetic is not allowed on void *
for (size_t index = 0; index < element_count; index++) {
print_element(element);
element += element_size;
}
}
你可以这样使用它:
void print_int(void *intp) {
printf("--%d--", *((int *) intp));
}
void main(void){
int a[5] = { 1, 2, 3, 4, 5 };
print_elements(a,
sizeof(a[0]), // The size of each element
sizeof(a) / sizeof(a[0]), // The number of elements
print_int); // A pointer to a suitable print function
}