目录
一、通过几个例子,浅谈一下我的学习见解!
#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: 15
return 0;
}