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)
将函数参数声明为函数时,编译器会自动将其类型调整为“函数的指针”。
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)