回调函数用法详细讲解
目录
一、通过几个例子,浅谈一下我的学习见解!
二、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;
}