C语言 函数指针(二):通过函数指针传址,在函数内调用函数
执行结果截图:
代码:
#include <stdio.h>
int add(int, int);
int sub(int, int);
int calc(int (* fp)(int, int), int , int);
int add(int num1, int num2)
{
return num1 + num2;
}
int sub(int num1, int num2)
{
return num1 - num2;
}
int calc(int (* fp)(int, int), int num1, int num2)
{
/* int (* fp)(int, int)定义了fp为一个函数指针,fp不是函数
* 函数指针fp是一个变量,需要被定义、被赋值、被调用,
* 函数指针变量,可以被一个函数名赋值,
* 函数名也即函数的指针,其值是函数的地址,
* 函数指针需在被赋值了函数地址后,才能被调用,
* 纯函数名代表的是函数的地址,不是对函数进行调用
* 只有在函数名后面跟着()才是对函数进行调用
* 函数(* fp)与函数add以及函数sub的类型一致,
* 如果将函数名赋值给指针函数fp,也即将函数的地址赋值给fp,那么
* (* fp)()代表了对fp所存的函数地址用 * 解引用,也就是调用函数
* (* fp)()就代表了对fp所指向的函数进行调用。
*/
return (* fp)(num1, num2);
}
int main()
{
/* 表达式calc(add, 3, 5)的执行过程为:
* 先调用函数calc,并且
* 将函数add的地址作为实参传址赋值给了函数calc的形参——函数指针fp,
* 也即函数指针fp指向函数add的地址,那么
* 在函数calc内执行(* fp)(3, 5),其实就是执行add(3, 5),
* 由函数calc返回函数add(3, 5)所返回的结果,由printf语句打印输出
*/
printf("3 + 5 = %d\n", calc(add, 3, 5));
printf("3 - 5 = %d\n", calc(sub, 3, 5));
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】