如果我有这样的声明:
int foo1 (int foo2 (int a));
如何实现此foo1
函数?喜欢,
int foo1 (int foo2 (int a))
{
// How can I use foo2 here, which is the argument?
}
如何在foo1
中调用main
函数?喜欢:
foo1(/* ??? */);
答案 0 :(得分:8)
将函数参数声明为函数时,编译器会自动将其类型调整为“函数的指针”。
int foo1 (int foo2 (int a))
与
完全相同int foo1 (int (*foo2)(int a))
(这类似于将函数参数声明为数组(例如int foo2[123]
)自动使其成为指针(例如int *foo2
)的方式。)
关于如何使用foo2
:您可以调用它(例如foo2(42)
)或取消引用它(*foo2
),这(通常和函数一起使用)会立即衰减再次指向指针(然后可以调用(例如,(*foo2)(42)
)或再次取消引用(**foo2)
,该指针立即退回到指针,从而...)。
要调用foo1
,您需要向其传递一个函数指针。如果周围没有现有的函数指针,则可以定义一个新函数(在main
之外),例如:
int bar(int x) {
printf("hello from bar, called with %d\n", x);
return 2 * x;
}
那你就可以做
foo1(&bar); // pass a pointer to bar to foo1
或等效地
foo1(bar); // functions automatically decay to pointers anyway
答案 1 :(得分:0)
也许,这个简单的示例可以为您提供帮助:
#include <stdio.h>
int foo1 (int foo2 (int),int i);
int sub_one (int);
int add_one (int);
int main() {
int i=10,j;
j=foo1(sub_one,i);
printf("%d\n",j);
j=foo1(add_one,i);
printf("%d\n",j);
}
int sub_one (int i) {
return i-1;
}
int add_one (int i) {
return i+1;
}
int foo1 (int foo2 (int),int i) {
return foo2(i);
}
答案 2 :(得分:-1)
看看下面的代码,它显示了如何以您希望的方式调用函数。
#include <stdio.h>
/* Declaration of foo1 . It receives a specific function pointer foo2 and an integer. */
int foo1 (int (*foo2)(int), int a);
int cube(int number)
{
return (number * number * number);
}
int square(int number)
{
return (number * number);
}
int foo1 (int (*foo2)(int), int a)
{
int ret;
/* Call the foo2 function here. */
ret = foo2(a);
printf("Result is: %d\r\n", ret);
return (ret);
}
int main()
{
int a = 3;
foo1(square, a);
foo1(cube, a);
return 0;
}