c - 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中遵循的约定,我还看到了一些遵循案例 2中约定的答案。两者似乎都对我正常工作。哪一个是正确的(或可取的)?
- 此外,为了调用函数指针,我看到了两种调用它们的方式 -
math_op(op_a, op_b)
或(*math_op)(op_a, op_b)
. 同样,有没有更好的方法来做到这一点 - 两者似乎对我来说都正常工作。
解决方案
我认为
表示被调用函数的表达式应具有指向返回 void 或返回数组类型以外的对象类型的函数的类型指针。
足以回答你的两个问题。函数的名称被隐式转换为指向函数类型的指针,因此在将函数的地址分配给函数指针时使用地址运算符是多余的。至于通过函数指针调用函数,语法与“普通”函数调用没有什么不同。
推荐阅读
- qt - 用 VS2019 构建 QT4.8.6 会报错
- c++ - 索引的指针泛化
- visual-studio-code - 如何在 VSCode 中使所有制表符长度相同?
- mysql - MySQL-Simple Query 需要 11 秒才能返回结果
- android - 为什么android房间抛出CursorWindowAllocationException?
- vue.js - 基于 webpack 应用的动态 vue-router
- php - PHP检查数组是否包含多个值
- python - ConnectionResetError: [WinError 10054] 连接被远程主机中止
- kubernetes - Kubernetes 部署消除了持久卷
- c++ - 不断降低内存分配效率。代码示例