如何在C语言中传递一个函数作为参数?

c function pointers syntax parameters


我想创建一个函数,对一组数据执行参数传递的函数。如何在C语言中传递一个函数作为参数?




Answer 1 Niyaz


Declaration

一个接受函数参数的函数的原型如下。

void func ( void (*f)(int) );

这说明参数 f 将是一个指向具有 void 返回类型且采用单个 int 参数的函数的指针。以下函数( print )是一个函数示例,由于它是正确的类型,因此可以作为参数传递给 func

void print ( int x ) {
  printf("%d\n", x);
}

函数调用

当调用一个带有函数参数的函数时,传递的值必须是一个函数的指针。使用函数的名称(不含括号)。

func(print);

会调用 func ,将print函数传递给它。

功能体

与任何参数一样, func 现在可以在函数体中使用参数的名称来访问参数的值。假设 func 将应用传递给数字0-4的函数。首先考虑一下循环直接调用print的样子:

for ( int ctr = 0 ; ctr < 5 ; ctr++ ) {
  print(ctr);
}

由于 func 的参数声明说 f 是指向所需函数的指针的名称,因此我们首先回想一下,如果 f 是指针,则 *ff 指向的东西(即,在这种情况下为函数 print )。结果,只需在上面的循环中将所有出现的打印替换为 *f

void func ( void (*f)(int) ) {
  for ( int ctr = 0 ; ctr < 5 ; ctr++ ) {
    (*f)(ctr);
  }
}

Source




Answer 2 roo


这个问题已经有了定义函数指针的答案,然而它们可能会变得非常混乱,特别是当你要在你的应用程序中传递它们时。为了避免这种不愉快,我建议你将函数指针类型化为更易读的东西。例如

typedef void (*functiontype)();

声明一个返回void且不接受参数的函数。要创建一个指向该类型的函数指针,你现在可以这样做。

void dosomething() { }

functiontype func = &dosomething;
func();

对于一个返回一个int并接受一个char的函数,你可以这样做

typedef int (*functiontype2)(char);

并使用它

int dosomethingwithchar(char a) { return 1; }

functiontype2 func2 = &dosomethingwithchar
int result = func2('a');

有一些库可以帮助将函数指针转换为可读的类型。该升压功能库是伟大的,是非常值得的努力!

boost::function<int (char a)> functiontype2;

是比上面的好得多。




Answer 3 Richard


从C ++ 11开始,您可以使用功能库以简洁通用的方式进行此操作。语法例如是

std::function<bool (int)>

其中 bool 是单参数函数的返回类型,该函数的第一个参数的类型为 int

我在下面附上了一个示例程序。

// g++ test.cpp --std=c++11
#include <functional>

double Combiner(double a, double b, std::function<double (double,double)> func){
  return func(a,b);
}

double Add(double a, double b){
  return a+b;
}

double Mult(double a, double b){
  return a*b;
}

int main(){
  Combiner(12,13,Add);
  Combiner(12,13,Mult);
}

但有时,使用模板函数会更方便。

// g++ test.cpp --std=c++11

template<class T>
double Combiner(double a, double b, T func){
  return func(a,b);
}

double Add(double a, double b){
  return a+b;
}

double Mult(double a, double b){
  return a*b;
}

int main(){
  Combiner(12,13,Add);
  Combiner(12,13,Mult);
}



Answer 4 Yogeesh H T


传递函数作为参数传递给另一个函数的地址如下所示

#include <stdio.h>

void print();
void execute(void());

int main()
{
    execute(print); // sends address of print
    return 0;
}

void print()
{
    printf("Hello!");
}

void execute(void f()) // receive address of print
{
    f();
}

我们也可以使用函数指针将函数作为参数传递

#include <stdio.h>

void print();
void execute(void (*f)());

int main()
{
    execute(&print); // sends address of print
    return 0;
}

void print()
{
    printf("Hello!");
}

void execute(void (*f)()) // receive address of print
{
    f();
}



Answer 5 doppelheathen


根据ISO C11 6.7.6.3p8,可以将函数作为函数指针“传递”:“应将参数声明为“函数返回类型”声明调整为“指向函数返回类型的指针”,如6.3所示。 .2.1。”。例如,这:

void foo(int bar(int, int));

与此相当。

void foo(int (*bar)(int, int));