在C语言中,是否可以将函数作为参数传递?

5

2
如何在C++中将函数作为参数传递? - quamrana
6个回答

9

不,你不能将“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()'都具有相同的原型模式:接受一个double类型参数并返回一个double类型值的函数。请注意,如果我错误地写成:
generator(0.0, 1.0, 0.02, sin());

我会遇到一堆编译错误——一个是因为 'sin()' 需要一个参数,另一个是因为 'generator()' 期望的最后一个参数应该是一个指向函数的指针而不是一个 double 值。
(还要注意的是,一个好的程序应该至少识别出它正在计算的函数,而重复增加一个 double 数字并不是一个保证精度的好方法。这只是一个例子。)

9

使用函数指针。
int (*ptr2_fun)() 这样。 接收函数为:
int execute_your_function(int (*fun)())

这里有一些示例


2
检查qsort()。它接受一个比较函数。 - Alexandru

6

4
是的。它本身不是一个函数,而是一个指向函数的指针。

参见qsort()

int cmp(const void *a, const void *b) { /* ... */ }
/* ... */
qsort(data, nelems, sizeof *data, cmp); /* pass the function `cmp` to qsort() */

3
当然,您可以使用函数指针。
#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;
}

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接