int (*foo(int(*f)(int,int)))(int,int)
{
printf("hello");
return f+1;
}
int fun1(int x, int y)
{
return x+y;
}
int fun2(int x,int y)
{
printf("hey");
return x*y;
}
int main()
{
int (*fun_ptr[2])(int,int);
int x,y;
fun_ptr[0]=&fun1;
x=fun_ptr[0](4,5);
printf("%d\n",x);
fun_ptr[1]=&fun2;
fun_ptr[0]=foo(fun_ptr[0]);
y=fun_ptr[0](4,5);
printf("%d",y);
return 0;
}
我尝试使用 return f+1 让 foo 返回指向 fun2 的指针。所以它应该(在我看来)指向数组 fun_ptr 中的下一个元素,其中 fun_ptr[1] 是指向 fun2 的指针。因此,y 应该是 20,但根本没有输出。 x 打印正常。
为了使指针算术能够处理数组,指针必须指向数组的元素。在这里,您有一个指向函数的指针数组,因此指向元素的指针将是指向函数指针的指针。那就是
int (**)(int, int)
。
因此,如果将 foo 的声明更改为
int (**foo(int(**f)(int,int)))(int,int)
它应该按您的预期工作。您还需要将其称为
foo(&fun_ptr[0])