gpt4 book ai didi

C 中函数指针的正确值类型

转载 作者:太空宇宙 更新时间:2023-11-04 06:12:31 25 4
gpt4 key购买 nike

我试图理解 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)。同样,是否有更好的方法来执行此操作 - 两者似乎都适合我。

最佳答案

我觉得

Function calls (§6.5.2.2/1) :

The expression that denotes the called function shall have type pointer to function returning void or returning an object type other than an array type.

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

关于C 中函数指针的正确值类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53437993/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com