在听斯坦福大学的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
的机制是什么,以及它与将函数指针作为参数传递有何不同?
答案 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;
}