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

时间:2019-03-05 17:00:17

标签: c function-pointers

如果我有这样的声明:

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(/* ??? */);

3 个答案:

答案 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;
}