- C编程教程
- C - 首页
- C语言基础
- C - 概述
- C - 特性
- C - 历史
- C - 环境设置
- C - 程序结构
- C - Hello World
- C - 编译过程
- C - 注释
- C - 词法单元
- C - 关键字
- C - 标识符
- C - 用户输入
- C - 基本语法
- C - 数据类型
- C - 变量
- C - 整数提升
- C - 类型转换
- C - 类型强制转换
- C - 布尔值
- C语言中的常量和字面量
- C - 常量
- C - 字面量
- C - 转义序列
- C - 格式说明符
- C语言中的运算符
- C - 运算符
- C - 算术运算符
- C - 关系运算符
- C - 逻辑运算符
- C - 位运算符
- C - 赋值运算符
- C - 一元运算符
- C - 自增和自减运算符
- C - 三元运算符
- C - sizeof 运算符
- C - 运算符优先级
- C - 其他运算符
- C语言中的决策
- C - 决策
- C - if 语句
- C - if...else 语句
- C - 嵌套 if 语句
- C - switch 语句
- C - 嵌套 switch 语句
- C语言中的循环
- C - 循环
- C - while 循环
- C - for 循环
- C - do...while 循环
- C - 嵌套循环
- C - 无限循环
- C - break 语句
- C - continue 语句
- C - goto 语句
- C语言中的函数
- C - 函数
- C - 主函数
- C - 按值调用函数
- C - 按引用调用函数
- C - 嵌套函数
- C - 可变参数函数
- C - 用户自定义函数
- C - 回调函数
- C - 返回语句
- C - 递归
- C语言中的作用域规则
- C - 作用域规则
- C - 静态变量
- C - 全局变量
- C语言中的数组
- C - 数组
- C - 数组的特性
- C - 多维数组
- C - 将数组传递给函数
- C - 从函数返回数组
- C - 可变长数组
- C语言中的指针
- C - 指针
- C - 指针和数组
- C - 指针的应用
- C - 指针运算
- C - 指针数组
- C - 指向指针的指针
- C - 将指针传递给函数
- C - 从函数返回指针
- C - 函数指针
- C - 指向数组的指针
- C - 指向结构体的指针
- C - 指针链
- C - 指针与数组
- C - 字符指针和函数
- C - 空指针
- C - 空指针
- C - 野指针
- C - 解引用指针
- C - 近、远和巨型指针
- C - 指针数组的初始化
- C - 指针与多维数组
- C语言中的字符串
- C - 字符串
- C - 字符串数组
- C - 特殊字符
- C语言中的结构体和联合体
- C - 结构体
- C - 结构体和函数
- C - 结构体数组
- C - 自引用结构体
- C - 查找表
- C - 点(.)运算符
- C - 枚举(或 enum)
- C - 结构体填充和打包
- C - 嵌套结构体
- C - 匿名结构体和联合体
- C - 联合体
- C - 位域
- C - Typedef
- C语言中的文件处理
- C - 输入和输出
- C - 文件I/O(文件处理)
- C预处理器
- C - 预处理器
- C - 预处理程序指令
- C - 预处理器运算符
- C - 宏
- C - 头文件
- C语言中的内存管理
- C - 内存管理
- C - 内存地址
- C - 存储类
- 其他主题
- C - 错误处理
- C - 可变参数
- C - 命令执行
- C - 数学函数
- C - static 关键字
- C - 随机数生成
- C - 命令行参数
- C编程资源
- C - 问答
- C - 快速指南
- C - 速查表
- C - 有用资源
- C - 讨论
C语言中的回调函数
回调函数用途广泛,尤其是在事件驱动的编程中。当触发特定事件时,映射到该事件的回调函数将被执行以响应这些事件。这通常用于 GUI 应用程序中,例如按钮点击可以启动一系列预定义的动作。
回调函数
回调函数基本上是任何作为参数传递给其他代码的可执行代码,该代码预计会在给定时间回叫或执行该参数。我们可以用其他方式定义它,例如:如果函数的引用作为参数传递给另一个函数以进行调用,则称为回调函数。
回调机制依赖于**函数指针**。函数指针是一个存储函数内存地址的变量。
这是一个简单的 C 语言中的 hello() 函数:
void hello(){ printf("Hello World."); }
我们如下声明指向此函数的指针:
void (*ptr)() = &hello;
现在我们可以使用此函数指针调用该函数,**(*ptr)();**
C语言中回调函数的示例
在这个例子中,hello() 函数被定义为 myfunction() 的参数。
#include <stdio.h> void hello(){ printf("Hello World\n"); } void callback(void (*ptr)()){ printf("Calling a function with its pointer\n"); (*ptr)(); // calling the callback function } main(){ void (*ptr)() = hello; callback(ptr); }
输出
Calling a function with its pointer Hello World
带参数的回调函数
在下面给出的示例中,我们还声明了两个具有相同原型的函数:square() 和 root()。
int square(int val){ return val*val; } int root(int val){ return pow(val, 0.5); }
回调函数被定义为接收一个参数以及一个具有整数参数的函数指针,该参数与上述函数匹配。
int callback(int a, int (*ptr)(int)){ int ret = (*ptr)(a); return ret; }
在 main() 函数中,我们通过传递一个整数和函数名(**square** / **root**)来调用回调,该函数名成为回调定义中的函数指针。
带参数的回调函数示例
完整的代码如下:
#include <stdio.h> #include <math.h> int callback(int a, int (*print_callback)(int)); int square(int value); int root (int value); int main(){ int x = 4; printf("Square of x: %d is %d\n", x, callback(x, square)); printf("Square root of x: %d is %d\n", x, callback(x, root)); return 0; } int callback(int a, int (*ptr)(int)){ int ret = (*ptr)(a); return ret; } int square(int val){ return val*val; } int root(int val){ return pow(val, 0.5); }
输出
Square of x: 4 is 16 Square root of x: 4 is 2
C语言中回调函数的类型
有两种**回调函数类型**:
同步回调
当回调函数传递给另一个函数时,该函数将其作为其过程的一部分执行,则该回调函数是同步的。调用函数在继续执行之前等待回调函数完成。当您需要立即获得结果或希望确保在继续执行之前完成一项任务时,这很有用。
异步回调
在这种情况下,调用函数触发回调函数,但不等待它完成。相反,它继续执行。它导致非阻塞操作。它通常用于事件驱动的编程中。
通用回调函数帮助开发人员编写用途广泛且更具适应性的 C 程序。
在本章中,我们解释了如何使用函数指针来增强 C 程序的灵活性。此外,我们展示了如何创建不限于特定函数指针类型的通用回调函数。