函数指针如何工作?

我问了一些具体的问题。

  1. 如何在课堂上初始化它们?
  2. 如何将函数作为参数传递?
  3. 是否需要在类中声明和定义函数指针?

对于问题2,这是我的意思:

void s(void) { //... } void f(function) { // what should I put as type to pass a function as an argument //... } f(s); 

要定义函数指针,请使用以下语法:

 return_type (*ref_name) (type args, ...) 

因此,要定义一个名为“doSomething”的函数引用,它返回一个int并接受一个int参数,你可以这样写:

 int (*doSomething)(int number); 

然后,您可以将引用分配给实际函数,如下所示:

 int someFunction(int argument) { printf("%i", argument); } doSomething = &someFunction; 

完成后,您可以直接调用它:

 doSomething(5); //prints 5 

因为函数指针本质上只是指针,所以你确实可以将它们用作类中的实例变量。

当接受函数指针作为参数时,我更喜欢使用typedef而不是使用函数原型中的混乱语法:

 typedef int (*FunctionAcceptingAndReturningInt)(int argument); 

然后,您可以使用此新定义的类型作为函数的参数类型:

 void invokeFunction(int func_argument, FunctionAcceptingAndReturningInt func) { int result = func(func_argument); printf("%i", result); } int timesFive(int arg) { return arg * 5; } invokeFunction(10, &timesFive); //prints 50 

这不是严格的答案,但是要将可配置/可分配代码作为类成员包含,我会提到使用带有operator()的类/结构。 例如:

 struct mycode { int k; mycode(int k_) : k(k_) { } int operator()(int x) { return x*k; } }; class Foo { public : Foo(int k) : f(k) {} public : mycode f; }; 

你可以做:

 Foo code(5); std::cout << code.f(2) << std::endl; 

它将打印'10',我写的一切都好。

你必须以这种方式声明f

 void f(void (*x)()) { x(); // call the function that you pass as parameter (Ex. s()). } 

这是一个关于函数指针和回调的优秀教程。

要回答第3个问题,您不必在课堂上声明它。 但是不要违反封装,我通常更喜欢成员函数指针或函子,而pointees又是类的成员。 上面的例子是除了Luis G. Costantini R之外的C风格函数指针。你可以看一下这个成员函数指针的方法。 通常考虑C样式函数指针,例如,回调机制,其中存在接收异步消息的C代码。 在这种情况下,没有选项而不是在全局范围内声明处理程序方法。