回调函数与普通函数调用分不清楚?3分钟帮你搞定!
在刚开始学习函数调用时,不少初学者弄不清楚“普通函数调用”和“回调函数”之间的区别,下面做一个简单的对比分析。
一句话简单区分:
普通函数调用: 函数直接被调用
回调函数: 函数作为参数被调用
这样解释或许还是不够直观,我们直接看例子吧!
普通函数调用
#include <stdio.h> // 被调用的函数1 int func1(int value) { printf("This is func1,value = %d\n",value); return 0; } // 被调用的函数2 int func2(int value) { printf("This is func2,value = %d\n",value); return 0; } // 普通函数调用 int handle_call_back(int value1,int value2) { func1(value1); // 函数直接被调用 func2(value2); // 函数直接被调用 return 0; } int main(void) { int a = 66; int b = 88; handle_call_back(a,b); return 0; }
执行结果
This is func1,value = 66 This is func2,value = 88
可以看出,这里普通函数的调用,是直接调用函数名func1和func2。
不带参的回调函数
#include <stdio.h> // 被调用的函数1 int call_back1(void) { printf("This is call_back1\n"); return 0; } // 被调用的函数2 int call_back2(void) { printf("This is call_back2\n"); return 0; } // 回调函数 int handle_call_back(int (*call_back)(void)) { call_back(); return 0; } int main(void) { handle_call_back(call_back1); // 函数作为参数被调用 handle_call_back(call_back2); // 函数作为参数被调用 return 0; }
执行结果
This is call_back1 This is call_back2
可以看出,call_back系列函数是作为handle_call_back的参数被调用的。上面是不带参数的回调函数,那带参的回调函数呢?
带参数的回调函数
#include <stdio.h> // 被调用的函数1 int call_back1(int value1) { printf("This is call_back1,value = %d\n",value1); return 0; } // 被调用的函数2 int call_back2(int value2) { printf("This is call_back2,value = %d\n",value2); return 0; } // 回调函数 int handle_call_back(int value,int (*call_back)(int)) { call_back(value); return 0; } int main(void) { int a = 10; int b = 20; handle_call_back(a,call_back1); // 函数作为参数被调用 handle_call_back(b,call_back2); // 函数作为参数被调用 return 0; }
执行结果
This is call_back1,value = 10 This is call_back2,value = 20
上面的例子可以看出,handle_call_back中的参数value,可以传给int (*call_back)(int),实现了带参回调函数。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库