函数作为参数vs函数指针作为参数

时间:2012-02-04 09:03:15

标签: c++ c function parameters

在听斯坦福大学的Programming Abstractions课程时,我遇到了一些代码如下所示。

void plot(double start, double end, double (fn)(double)) {
    double i;
    for (i = start; i <= end; i += 1)
        printf("fn(%f) = %f\n", i, fn(i));
}

double plus1(double x) {
    return x + 1;
}

int main(void) {
    plot(1, 10, plus1);
    return 0;
}

我使用GCC编译了我的系统上的代码,然后是G ++;他们都跑得很好。

我知道将int i = 2传递给void func1(int a)这样的函数会在将i传递给&i时为该函数制作void func2(int *a)的新副本}只会为函数func2提供i的地址。

所以任何人都可以向我解释将fn传递给plot的机制是什么,以及它与将函数指针作为参数传递有何不同?

2 个答案:

答案 0 :(得分:7)

void foo(double fn(double))void foo(double (*fn)(double))之间绝对没有区别。两者都声明了将函数指针作为参数的函数。

这类似于void bar(double arr[10])void bar(double* arr)之间的差异。

答案 1 :(得分:0)

抱歉我的错误。

void foo(int (fn)(int)){}
void bar(int (*fn)(int)){}

编译上面这样的代码:

  

gcc -S sample.c

你会发现没有区别。 只是不同的编码风格。

您也可以尝试编译并运行此代码:

#include <stdio.h>
void foo(int (fn)(int))
{
    printf("foo: %x.\n",fn);
}
void bar(int (*fn)(int))
{
    printf("bar: %x.\n",fn);
}
int main(int argc)
{
    foo(main);
    bar(main);
    return 0;
}