我需要编写一个函数来接收函数指针数组.我写了下面的代码,但是我现在在测试它时遇到了麻烦.
这是定义函数数组指针的正确方法吗?
typedef (*Function)(double);
void func(Function* arr);
Run Code Online (Sandbox Code Playgroud)
如果我想用[20]声明数组的大小,我写道:
void func(Function arr[20]);
Run Code Online (Sandbox Code Playgroud)
?
谢谢你的帮助
首先,我通常的方法来计算复杂的类型.从标识符开始,然后一次添加其余一步:
f -- f
f[N] -- is an N-element array
*f[N] -- of pointers
(*f[N])() -- to functions
T (*f[N])() -- returning T
Run Code Online (Sandbox Code Playgroud)
对于一个指向函数的指针数组,该函数采用double参数并返回double值,那就是
double (*f[N])(double);
Run Code Online (Sandbox Code Playgroud)
但是,请记住,在大多数情况下,数组类型的表达式"衰减"从"N元素数组T"到"指向T".将数组表达式作为参数传递给函数时,函数实际接收的是指针.因此,您的函数将接收类型为"指向函数返回double的指针"类型的对象,而不是接收类型为"函数返回双指针的N元素数组"的对象,或者
double (**f)(double)
Run Code Online (Sandbox Code Playgroud)
所以你的函数定义看起来像
void func(double (**f)(double))
{
int i;
...
for (i = 0; f[i] != NULL; i++)
{
double x = (*f[i])((double) i);
}
}
Run Code Online (Sandbox Code Playgroud)
调用者看起来像
double a(double x) {...}
double b(double x) {...}
double c(double x) {...}
void foo(void)
{
double (*list[])(double) = {a, b, c, NULL};
func(list);
}
Run Code Online (Sandbox Code Playgroud)
如果你想使用typedef,你可以使用这样的东西:
typedef double Dblfunc(double); // typedef for function type
typedef Dblfunc *Dblfuncptr; // typedef for function pointer type
void func(Dblfuncptr *f)
{
int i;
for (i = 0; f[i] != NULL; i++)
{
double x = (*f[i])((double) i);
...
}
}
...
void foo(void)
{
Dblfuncptr list[] = {a, b, c, NULL}; // EDIT: fixed type
func(list);
}
Run Code Online (Sandbox Code Playgroud)
使用typedef使得数组和函数参数看起来更像常规类型.就个人而言,我更喜欢使用"原始"类型,因为它明确显示我正在处理函数指针,它显示了返回和参数类型.
函数返回什么?你是函数指针 typedef 中的返回类型,就像你应该有类似的东西
typedef double (*Function)(double);
Run Code Online (Sandbox Code Playgroud)