代码之家  ›  专栏  ›  技术社区  ›  Hannoun Yassir

是否可以在C中传递函数作为参数?[复制品]

c
  •  2
  • Hannoun Yassir  · 技术社区  · 15 年前

    可能重复:
    How do you pass a function as a parameter in C?

    是否可以在C中传递函数作为参数?如果是,怎么办?

    6 回复  |  直到 15 年前
        1
  •  7
  •   Jonathan Leffler    15 年前

    不,不能将“函数”作为参数传递。但是,您可以将指针传递给函数。

    当您为函数调用按名称引用一个没有括号的函数时,您将引用一个指向函数的指针。因此,例如,我们可以考虑为数学函数生成值表的函数:

    #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()'需要一个指向函数的指针,而不是最后一个参数的双精度值。

    (还要注意的是,一个好的程序至少可以识别它正在计算的函数,而重复增加一个双数对于准确性来说不是一个好主意。这只是一个例子。)

        2
  •  9
  •   Arkaitz Jimenez    15 年前

    使用指向函数的指针。
    喜欢 int (*ptr2_fun)() 接收功能为:
    int execute_your_function(int (*fun)())

    给你一些 examples

        3
  •  5
  •   Naveen    15 年前
        4
  •  3
  •   user204884    15 年前

    伟大的函数指针教程:

    http://www.newty.de/fpt/index.html

        5
  •  3
  •   nos    15 年前

    当然,您可以使用函数指针。

    #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
  •  3
  •   pmg    15 年前

    是的 . 非函数 本身 而是指向函数的指针。

    qsort() .

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