鞍山自适应网站制作,公司网站建设需求表,邢台信息网官网,做p2p理财网站前言 此篇讲解的主要是函数与指针的那些事~ 书接上回 拿捏c语言指针#xff08;上#xff09;和 拿捏c语言指针#xff08;中#xff09; 没有看的小伙伴要抓紧喽~ 欢迎关注个人主页#xff1a;逸狼 创造不易#xff0c;可以点点赞吗~ 如有错误#x… 前言 此篇讲解的主要是函数与指针的那些事~ 书接上回 拿捏c语言指针上和 拿捏c语言指针中 没有看的小伙伴要抓紧喽~ 欢迎关注个人主页逸狼 创造不易可以点点赞吗~ 如有错误欢迎指出~ 函数指针变量 函数指针变量 用于存放函数的地址 其中函数名函数地址Add可以换成Add *pfAdd 也就是说Add、*pf、pf三者都可以调用函数 两段有趣的代码 (*void(*)()0)() 拆分(* void(*)() 0)() void(*)() 是函数指针类型此函数没有参数返回值是void void(*)() )0 是将0这个整数值强制类型转换为一个函数的地址。 * void(*)() 0 是解引用 (* void(*)() 0)() 是调用地址为0处的函数 void(* signal ( int,void(*)(int) ) )(int); 拆分void(* signal ( int,void(*)(int) ) )(int); signal是一个函数其参数有2个int类型和函数指针类型void(*)(int) 该指针指向的函数参数是int,返回值是void。 signal函数的返回类型是void(* )(int)函数指针 类型该指针指向的函数参数是int,返回值是void。 typedef类型重命名 可以将复杂的类型名字重命名 如typedef unsigned int uint; 对于指针类型重命名 如typedef int* ptr_t; 对于数组指针和函数指针类型重命名 与以上有区别,新的名字要放在里面 如typedef int(*parr_t)[5]; parr_t是数组指针类型新的名字 如typedef void(*pf)(int); pf是函数指针类型新的名字 所以我们可以将void(* signal ( int,void(*)(int) ) )(int); 简化为以下两句代码 typedef void(*ptr_t)(int) ; 重命名void(*)(int) 为ptr_t ptr_t signal(int,ptr_t); signal函数的参数类型是int和ptr_t,返回值类型是ptr_t 函数指针数组 函数指针数组本质上是一个数组里面存放的是函数指针变量 如下代码中 int(*pfArr[4])(int, int) { Add,Sub,Mul,Div };//pfArr就是一个函数指针数组可以存放4个元素 //加法函数
int Add(int x, int y)
{return x y;
}
//减法函数
int Sub(int x, int y)
{return x - y;
}
//乘法函数
int Mul(int x, int y)
{return x * y;
}
//除法函数
int Div(int x, int y)
{return x / y;
}
int main()
{int(*pf)(int, int) Add;//pf是函数指针int(*pfArr[4])(int, int) { Add,Sub,Mul,Div };//pfArr是函数指针数组return 0;
} 函数指针数组应用--实现一个简易计算器 实现一个简易计算器有 加减乘除 功能。 代码实现 利用函数指针数组存放计算函数地址方便调用。 如下代码中int(*pfArr[5])(int, int) { NULL,Add,Sub,Mul,Div };数组下标0处设为NULL方便其他计算函数对应菜单标号 #includestdio.h
//计算器菜单
void menu()
{printf(*****************************\n);printf(*** 1.Add 2.Sub ***\n);printf(*** 3.Mul 4.Div ***\n);printf(*** 0.exit ***\n);printf(*****************************\n);
}
//加法函数
int Add(int x, int y)
{return x y;
}
//减法函数
int Sub(int x, int y)
{return x - y;
}
//乘法函数
int Mul(int x, int y)
{return x * y;
}
//除法函数
int Div(int x, int y)
{return x / y;
}
int main()
{int input 0;int x 0;int y 0;int(*pfArr[5])(int, int) { NULL,Add,Sub,Mul,Div };//pfArr是函数指针数组// 0 1 2 3 4do{menu();printf(请选择);scanf(%d, input);if (input 0){printf(退出计算器\n);}else if (input 1 input 4){printf(请输入两个操作数);scanf(%d%d, x, y);int ret pfArr[input](x,y);printf(结果是%d\n, ret);}else{printf(选择错误请重新选择\n);}} while (input);return 0;
} 结果展示 回调函数 回调函数就是⼀个通过函数指针调⽤的函数。 把函数的指针地址作为参数传递给另⼀个函数当这个指针被⽤来调⽤其所指向的函数 时被调⽤的函数就是回调函数。 其中qsort函数的运用是 回调函数 典例 可以参考 手撕qsort函数~ 本篇就不再赘述了