此问题在此处已有答案:
13年前就关门了。
可能重复:
How do you pass a function as a parameter in C?在C语言中,是否可以将函数作为参数传递?如果可以,如何传递?
e7arh2l61#
不可以,您不能将'function'当做参数传递。不过,您可以改为传递指向函式的指标。当你通过名字引用一个函数而不使用括号时,你是在引用一个指向函数的指针。因此,例如,我们可以考虑一个为数学函数生成值表的函数:
#include <math.h> #include <stdio.h> static void generator(double lo, double hi, double inc, double (*function)(double)) { double x; for (x = lo; x < hi; x += inc) printf("x = %6g; f(x) = %6g\n", x, (*function)(x)) } int main(void) { generator(0.0, 1.0, 0.02, sin); generator(0.0, 1.0, 0.02, cos); generator(0.0, 1.0, 0.02, sqrt); return(0); }
这里,函数'sin()'、'cos()'和'sqrt()'都有相同的原型模式:函数接受双精度参数并返回双精度值。请注意,如果我错误地写了:
generator(0.0, 1.0, 0.02, sin());
我会得到一堆编译错误--一个是因为'sin()'需要一个参数,另一个是因为'generator()'需要一个指向函数的指针,而不是一个双精度值作为最后一个参数。(Also请注意,一个好的程序至少应该识别出它正在计算的函数,而双精度数的重复增量对于准确性来说并不是一个好主意。2这只是一个例子。
2w2cym1i2#
使用指向函数的指针。如int (*ptr2_fun)()接收函数为:int execute_your_function(int (*fun)())这里有一些examples
int (*ptr2_fun)()
int execute_your_function(int (*fun)())
gajydyqb3#
使用function pointers
z2acfund4#
是。不是函数 * 本身 *,而是指向函数的指针。
请参阅qsort()。
qsort()
int cmp(const void *a, const void *b) { /* ... */ } /* ... */ qsort(data, nelems, sizeof *data, cmp); /* pass the function `cmp` to qsort() */
5us2dqdw5#
伟大的函数指针教程在这里:http://www.newty.de/fpt/index.html
muk1a3rh6#
当然,您可以使用函数指针。
#include <stdio.h> typedef void (*bar_callback)(void); void foo(void) { puts("foo"); } void bar(bar_callback callback) { puts("bar"); callback(); } int main(int argc,char **argv) { bar(foo); return 0; }
6条答案
按热度按时间e7arh2l61#
不可以,您不能将'function'当做参数传递。不过,您可以改为传递指向函式的指标。
当你通过名字引用一个函数而不使用括号时,你是在引用一个指向函数的指针。因此,例如,我们可以考虑一个为数学函数生成值表的函数:
这里,函数'sin()'、'cos()'和'sqrt()'都有相同的原型模式:函数接受双精度参数并返回双精度值。请注意,如果我错误地写了:
我会得到一堆编译错误--一个是因为'sin()'需要一个参数,另一个是因为'generator()'需要一个指向函数的指针,而不是一个双精度值作为最后一个参数。
(Also请注意,一个好的程序至少应该识别出它正在计算的函数,而双精度数的重复增量对于准确性来说并不是一个好主意。2这只是一个例子。
2w2cym1i2#
使用指向函数的指针。
如
int (*ptr2_fun)()
接收函数为:int execute_your_function(int (*fun)())
这里有一些examples
gajydyqb3#
使用function pointers
z2acfund4#
是。不是函数 * 本身 *,而是指向函数的指针。
请参阅
qsort()
。5us2dqdw5#
伟大的函数指针教程在这里:
http://www.newty.de/fpt/index.html
muk1a3rh6#
当然,您可以使用函数指针。