我想将一个“多态”指针数组传递给一个函数。
我可以在没有警告的情况下执行以下操作:
foo (void* ptr);
bar()
{
int* x;
...
foo(x);
}
gcc 显然会自动转换x
为 a (void*)
,这只是花花公子。
但是,当我执行以下操作时会收到警告:
foo (void** ptr);
bar()
{
int** x; // an array of pointers to int arrays
...
foo(x);
}
note: expected ‘void **’ but argument is of type ‘int **’
warning: passing argument 1 of ‘foo’ from incompatible pointer type [enabled by default]
我的问题是:为什么将 an(int*)
作为(void*)
参数传递不是“不兼容的”,而是(int**)
作为(void**)
参数传递?
由于所有指针类型的大小都相同(对吗?自从我使用 C 以来已经有一段时间了),我仍然可以执行以下操作:
void mainFunc1(int** arr, int len)
{
//goal is to apply baz to every int array
foo(baz, arr, len);
}
void mainFunc2(double** arr, int len)
{
//goal is to apply baz to every int array
foo(qux, arr, len);
}
// I PROMISE that if I pass in a (int**) as ptr, then funcPtr will interpret its (void*) argument as an (int*)
void foo(funcPtr f, void** ptr, int len)
{
for(int i = 0; i < len; i++)
{
f(ptr[i]);
}
}
void baz(void* x)
{
int* y = (int*)x;
...
}
void qux(void* x)
{
double* y = (double*)x;
...
}
所有 void 指针的目的是让我可以使用函数指针应用于将(在堆栈中)具有不同类型的 ptr 参数的函数:一些将采用int
数组,一些将采用double
数组等。