首页 > 解决方案 > C中函数指针的正确值类型

问题描述

我试图理解 C 中的函数指针。在互联网上阅读它时(主要是堆栈溢出 QA) - 我遇到了两种可以为函数指针赋值的方法

#include <stdio.h>

double add(int a, double b) {
  return a + b;
}

double subtract(int a, double b) {
  return a - b;
}

int main() {
  int op_a = 23;
  double op_b = 2.9;

  // Case 1. Just pass the function (not its address)
  double (*math_op)(int a, double b) = add;
  printf("The output of Math Operation %f\n", math_op(op_a, op_b));

  // Case 2. Pass the function's address
  math_op = &subtract;
  printf("The output of Math Operation %f\n", math_op(op_a, op_b));

  printf("End of program\n");
  return 0;
}

我有几个问题

  1. 在上面的代码中-将值分配给函数指针的正确方法是什么。我看到了几个关于堆栈溢出的答案,它们遵循案例 1中遵循的约定,我还看到了一些遵循案例 2中约定的答案。两者似乎都对我正常工作。哪一个是正确的(或可取的)?
  2. 此外,为了调用函数指针,我看到了两种调用它们的方式 -math_op(op_a, op_b)(*math_op)(op_a, op_b). 同样,有没有更好的方法来做到这一点 - 两者似乎对我来说都正常工作。

标签: cfunction-pointers

解决方案


我认为

函数调用(§6.5.2.2/1)

表示被调用函数的表达式应具有指向返回 void 或返回数组类型以外的对象类型的函数的类型指针。

足以回答你的两个问题。函数的名称被隐式转换为指向函数类型的指针,因此在将函数的地址分配给函数指针时使用地址运算符是多余的。至于通过函数指针调用函数,语法与“普通”函数调用没有什么不同。


推荐阅读