在函数实现中如何使用函数的函数参数?

Eas*_*mer 3 c function-pointers

如果我有这样的声明:

int foo1 (int foo2 (int a));
Run Code Online (Sandbox Code Playgroud)

如何实现此foo1功能?喜欢,

int foo1 (int foo2 (int a))
{
    // How can I use foo2 here, which is the argument?
}
Run Code Online (Sandbox Code Playgroud)

我该如何调用foo1函数main?喜欢:

foo1(/* ??? */);
Run Code Online (Sandbox Code Playgroud)

mel*_*ene 8

将函数参数声明为函数时,编译器会自动将其类型调整为“函数的指针”。

int foo1 (int foo2 (int a))
Run Code Online (Sandbox Code Playgroud)

与...完全相同

int foo1 (int (*foo2)(int a))
Run Code Online (Sandbox Code Playgroud)

(这类似于将函数参数声明为数组(例如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;
}
Run Code Online (Sandbox Code Playgroud)

那你可以做

foo1(&bar);  // pass a pointer to bar to foo1
Run Code Online (Sandbox Code Playgroud)

或同等

foo1(bar);  // functions automatically decay to pointers anyway
Run Code Online (Sandbox Code Playgroud)