在C中是否可以将函数作为参数传递?[duplicate]

tag5nh1u  于 2022-12-03  发布在  其他
关注(0)|答案(6)|浏览(143)

此问题在此处已有答案

13年前就关门了。

可能重复:

How do you pass a function as a parameter in C?
在C语言中,是否可以将函数作为参数传递?如果可以,如何传递?

e7arh2l6

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这只是一个例子。

2w2cym1i

2w2cym1i2#

使用指向函数的指针。
int (*ptr2_fun)()接收函数为:
int execute_your_function(int (*fun)())
这里有一些examples

z2acfund

z2acfund4#

。不是函数 * 本身 *,而是指向函数的指针。

请参阅qsort()

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

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

相关问题