如何在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;
比上面的要好得多。