函数指针作为参数

inq*_*ive 39 c function-pointers argument-passing

是否可以将函数指针作为参数传递给C中的函数?

如果是这样,我将如何声明和定义一个以函数指针作为参数的函数?

Meh*_*ari 70

当然.

void f(void (*a)()) {
    a();
}

void test() {
    printf("hello world\n");
}

int main() {
     f(&test);
     return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 两者都有效.&符号是可选的.因此在调用函数指针时取消引用指针. (7认同)
  • 对函数指针类型使用typedef可以使代码eaiser读取. (5认同)
  • 将呼叫改为f(测试); (4认同)
  • 没错,无需更改任何内容。而且,即使参数声明中的“指针”语法也是可选的。上面的`f`可以声明为`void f(void a())`。 (2认同)

Mic*_*der 27

假设你有功能

int func(int a, float b);
Run Code Online (Sandbox Code Playgroud)

所以指向它的指针就是

int (*func_pointer)(int, float);
Run Code Online (Sandbox Code Playgroud)

所以你可以像这样使用它

  func_pointer = func;
  (*func_pointer)(1, 1.0);

  /*below also works*/
  func_pointer(1, 1.0);
Run Code Online (Sandbox Code Playgroud)

为了避免每次需要时指定完整的指针类型,你需要typedef

typedef int (*FUNC_PTR)(int, float);
Run Code Online (Sandbox Code Playgroud)

而不是像任何其他类型一样使用

void executor(FUNC_PTR func)
{ 
   func(1, 1.0);
}

int silly_func(int a, float b)
{ 
  //do some stuff
}

main()
{
  FUNC_PTR ptr;
  ptr = silly_func;
  executor(ptr); 
  /* this should also wotk */
  executor(silly_func)
}
Run Code Online (Sandbox Code Playgroud)

我建议看世界着名的C常见问题.


Bat*_*ted 12

一个很好的例子:

int sum(int a, int b)
{
   return a + b;
}

int mul(int a, int b)
{
   return a * b;
}

int div(int a, int b)
{
   return a / b;
}

int mathOp(int (*OpType)(int, int), int a, int b)
{
   return OpType(a, b);
}

int main()
{

   printf("%i,%i", mathOp(sum, 10, 12), mathOp(div, 10, 2));
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是:'22,5'