如果我有这样的声明:
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(/* ??? */);
将函数参数声明为函数时,编译器会自动将其类型调整为“指向函数的指针”。
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
也许,这个简单的例子可以帮助你:
#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);
}
看看下面的代码,它展示了如何以你想要的方式调用函数。
#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;
}