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

问题描述 投票:3回答:3

如果我有这样的声明:

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(/* ??? */);
c function-pointers
3个回答
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

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);
}

-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;
}
© www.soinside.com 2019 - 2024. All rights reserved.