如何在C中将函数作为参数传递?

时间:2020-03-05 18:39:18  来源:igfitidea点击:

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

解决方案

回答

我们需要传递一个函数指针。语法有点笨拙,但是一旦我们熟悉它,它的功能就会非常强大。

回答

宣言

具有函数参数的函数原型如下所示:

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

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

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

函数调用

使用函数参数调用函数时,传递的值必须是指向函数的指针。为此使用函数名称(不带括号):

func(print);

会调用func,将打印功能传递给它。

功能体

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

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

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

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

来自http://math.hws.edu/bridgeman/courses/331/f05/handouts/c-c++-notes.html

回答

这个问题已经有了定义函数指针的答案,但是它们会变得非常混乱,特别是如果要在应用程序中传递它们的话。为避免这种不愉快,我建议我们将函数指针键入defdef使其更具可读性。例如。

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函数库很棒,值得付出努力!

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

比上面的要好得多。