这只是一个测试,只是为了理解它是如何工作的。但我不明白为什么我得到这个输出。
#include <stdio.h>
void f(void *a[]){
for(int t=0; t<5;t++){
printf("--%d--",a[t]);
}
}
void main(void){
int a[5]={1,2,3,4,5};
f(a);
}
所以我得到了这个输出:
- 1 ---- ---- 3 5 ---- ---- 428351232 4195936 -
答案 0 :(得分:2)
你告诉函数期望一组void*
指针。函数返回值也不正确,循环增量异常。试试这个:
#include <stdio.h>
int f(int a[]){
int r = 0;
for(int t = 0; t < 5; t++){
printf("--%d--", a[t]);
}
return r;
}
void main(void){
int a[5]= { 1, 2, 3, 4, 5};
f(a);
}
节目输出:
--1----2----3----4----5--
如果您启用了所有编译器警告,则会向您显示这些错误。
答案 1 :(得分:1)
根据你的标题,你需要一个接受一个数组类型未知的数组的函数。没有这样的函数,因为没有数组永远作为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
}
答案 2 :(得分:-1)
在函数中,您必须将向量转换回整数,以便编译器可以知道数组元素的宽度,并且当您想要访问数组的元素时它可以添加适当的偏移量。 / p>
所以正确的代码是:
void f(void *a[]){
int *v=(int *) a;
for(int t=0; t<5;t++){
printf("--%d--",v[t]);
}
}