当前位置: 首页 > news >正文

回调函数用法详细讲解

目录

一、通过几个例子,浅谈一下我的学习见解!

二、typedef关键字用法回顾

1)基本语法

2)主要用途

1、为基本数据类型定义别名

2、为复杂类型定义别名

>>1.数组类型

>>2.指针类型

>>3.结构体类型

>>4.函数指针

3)优势

4)综合示例


一、通过几个例子,浅谈一下我的学习见解!

#include "stdio.h"//定义回调函数的类型
typedef void (*CallbackFunction)(int);/**如果说不定义回调函数的类型,那么区别在于 performOperation 函数要这样写!注意区分!void performOperation(int data, void (*callback)(int)){//执行某些操作printf("执行操作,数据位: %d\n", data);//调用回调函数if(callback != NULL){callback(data);}}
*///函数接受一个回调函数作为参数
void performOperation(int data, CallbackFunction callback)
{//执行某些操作printf("执行操作,数据位: %d\n", data);//调用回调函数if(callback != NULL){callback(data);}
}//回调函数示例
void displayData(int data)
{printf("回调函数被调用,数据显示:%d\n", data);
}int main(void)
{int data = 42;//调用函数,并传递回调函数performOperation(data, displayData);return 0;
}

可以看下这个图,一样的道理,可能比较直观!

1、写回调函数;

2、main方法中调用被赋值的函数,并传入回调函数的函数名(传入);

3、函数中的变量名被赋值替换,回调函数被调用!

二、typedef关键字用法回顾

       typedef关键字在C语言中,主要用途是为现有的数据类型定义一个新的名字别名),可以提高代码的可读性和可维护性。

1)基本语法

typedef 原类型名 新类型名;

原类型名是已存在的类型,可以是基本数据类型、结构体、联合体、枚举、指针等。新类型名是你为这个类型定义的新名称。

2)主要用途

1、为基本数据类型定义别名
typedef int Integer;

之后可以使用Interger代替Int来声明变量!

Integer a = 10;
2、为复杂类型定义别名
>>1.数组类型
typedef int Array[10];

Array代表一个包含10个整数的数组类型:

Array myArray;
>>2.指针类型
typedef char* String;

string表示一个指向字符的指针:

String str = "Hello";
>>3.结构体类型
typedef struct
{int x;int y;
}Point;

现在可以使用Point来声明结构体变量:

Point p;
p.x = 10;
p.y = 20;
>>4.函数指针
typedef int (*Callback)(int, int);

Int表示函数的返回类型是int, Callback代表一个指向函数的指针。

这句代码的意思是“定义一个新的类型名Callback,它代表一个指向函数的指针,该函数接受两个int参数并返回一个int类型值。”

Callback myFunction;

3)优势

1、提高代码可读性:可以使代码更易于理解。

2、简化代码:特别是对于复杂的类型,使用typedef可以简化类型声明,减少错误。

3、增强可移植性:跨平台开发中,可以使用typedef来定义与平台相关的额类型,从而提高代码的可移植性。

4、模块化设计:更易于维护和修改!

4)综合示例

#include "stdio.h"// 为基本数据类型定义别名
typedef int MyInt;// 为结构体定义别名
typedef struct
{MyInt x;MyInt y;
}MyPoint;// 为函数指针定义别名
typedef MyInt (*MyCallback)(MyInt, MyInt);// 回调函数示例
MyInt add(MyInt a, MyInt b)
{return a+b;
}int main(void)
{//使用别名声明变量MyInt num = 10;MyPoint p;p.x = 5;p.y = 10;//使用函数指针别名MyCallback callback = add;MyInt result = callback(num, p.x);printf("Result: %d\n", result); // 输出:Result: 15return 0;
}

相关文章:

  • L1-002 打印沙漏
  • libwebsocket建立服务器需要编写LWS_CALLBACK_ADD_HEADERS事件处理
  • [区块链lab2] 构建具备加密功能的Web服务端
  • 基于javaEE+jqueryEasyUi+eclipseLink+MySQL的课程设计客房管理信息系统
  • 【系统搭建】Ubuntu系统两节点间SSH免密配置
  • KALI搭建log4j2靶场及漏洞复现全流程
  • Uniapp:列表选择提示框
  • JSP技术入门指南【一】利用IDEA从零开始搭建你的第一个JSP系统
  • Docker Compose 命令实现动态构建和部署
  • 2025年推荐使用的开源大语言模型top20:核心特性、选择指标和开源优势
  • 全链路开源数据平台技术选型指南:六大实战工具链解析
  • 纷析云开源财务软件:企业财务数字化转型的灵活解决方案
  • lombok requires enabled annotation processing
  • 三层路由器,SSH远程登录访问路由器,通过telnet远程登录访问路由器(不安全),路由器的基本设置之多网络互联解决办法:单臂路由
  • Web3技术如何提升用户数据保护
  • 05-DevOps-Jenkins自动拉取构建代码
  • 【路由交换方向IE认证】BGP选路原则之Local Preference属性
  • 计算机网络 实验四 静态路由的配置与应用
  • 自动化浏览器环境与 Node.js 环境的逆向分析:完整教程
  • 【开发语言】悬空指针问题
  • 做网站费用多少钱/友情链接属于免费推广吗
  • 清新网站设计/想学网络营销怎么学
  • 典型的口碑营销案例/互联网seo是什么意思
  • 怎么用新浪云做网站/百度seo关键词优化工具
  • 大浪做网站/如何让百度快速收录
  • 高端品牌女装模特图片/山东服务好的seo