复习typedef
两种使用情况:
1.typedef int myint_t; //在语句开头加上typedef关键字,myint_t就是我们定义的新类型
2.typedef void (PFunCallBack)(char pMsg, unsigned int nMsgLen);//一般应用在回调函数
typedef的第二种用法:
普通函数指针:
定义函数:void printHello(int i);
定义函数指针:void (*pFunc)(int);
指向:pFunc = &printHello;
调用:(*pFunc)(110);
其中:void (*pFunc)(int) 是声明一个函数指针,指向返回值是void,调用参数是(int)的函数,变量名是pFunc,
typedef的函数指针:
typedef重命名一个函数指针方法:typedef void (*PrintHelloHandle)(int);
用这个方法定义:PrintHelloHandle pFunc;
指向:pFunc = &printHello;
调用:(*pFunc)(110);
注意两者的区别:第一个直接定义pFunc,第二个使用typedef定义pFunc
回调函数
功能:传递函数过去(callback),然后调用函数(caller),满足条件之后再回过头调用传递的函数(callback)。
为什么要使用回调函数:可以满足两个函数的互相调用
和普通函数调用一样,只不过参数是函数指针,运行到回调函数部分之后,运行回调函数,然后再回来。
理解代码一:
#include <iostream>
typedef void (*Fun)(int);//定义一个函数指针类型
Fun p = NULL;//用Fun定义一个变量p,它指向一个返回值为空参数为int的函数
void caller(Fun pCallback)
{
p = pCallback;
//达成某一条件后,通过名片(函数指针p),传回结果
int result = 1;
(*p)(result);//开始回调
std::cout << "caller part " << std::endl;//回调函数结束之后,还会回来
}
void callback(int a)//回调函数
{
std::cout << "callback part " << std::endl;
std::cout << "callback result = " << a << std::endl;
}
int main(int argc, char* argv[])
{
caller(callback);
return 0;
}
理解代码二:
#include <stdio.h>
typedef int student_id;
typedef int student_age;
typedef struct _Student{
student_id id;
student_age age;
}Student;
//类型重定义:函数指针类型
typedef bool (*pFun)(Student, Student);
//-----------------------------------------------
//冒泡排序法:能够按AGE或ID排序,用同一个函数实现
//-----------------------------------------------
void sort(Student stu[],const int num,pFun fun)
{
Student temp;
for(int i = 0; i < num; ++i){
for(int j = 0; j < num - i -1; ++j)
{
if((*fun)(stu[j],stu[j+1]))//开始回调
{
temp = stu[j];
stu[j] = stu[j+1];
stu[j+1] = temp;
}
}
}
}
//-----------------------------------------------
//回调函数:比较年龄
//-----------------------------------------------
bool CompareAge(Student stu1,Student stu2)
{
//更改从大到小还是从小到大的顺序,只需反一下。
if(stu1.age < stu2.age)
return true;
return false;
}
//-----------------------------------------------
//回调函数:比较
//-----------------------------------------------
bool CompareId(Student stu1,Student stu2)
{
//更改从大到小还是从小到大的顺序,只需反一下。
if(stu1.id < stu2.id)
return true;
return false;
}
int main()
{
Student stu[] = {
{1103,24},
{1102,23},
{1104,22},
{1107,25},
{1105,21}};
pFun fun = CompareAge;
int size = sizeof(stu)/sizeof(Student);
sort(stu,size,fun);
for(int i = 0; i < size; ++i){
printf("%d %d\n",stu[i].id,stu[i].age);
}
return 0;
}