免费html模板素材网站,织梦做单页面网站,网站如何seo推广,建设互联网站机房需要哪些设备#x1f3ac; 鸽芷咕#xff1a;个人主页 #x1f525; 个人专栏:《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想#xff0c;就是为了理想的生活! 文章目录 #x1f4cb; 前言#x1f4ac; 函数指针数组#x1f4ad; 函数指针数组的定义#x1f4ad; 函数指针数组的… 鸽芷咕个人主页 个人专栏:《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想就是为了理想的生活! 文章目录 前言 函数指针数组 函数指针数组的定义 函数指针数组的应用 —— 转移表 代码改进 指向函数指针数组的指针 回调函数 利用回调函数进行代码改进 全篇总结 前言 hello 各位宝子们大家好啊上节课我们学习了函数指针而函数指针有一个非常大的用途就是实现回调函数 ⛳️在了解回调函数之前我们还需要学习一下函数指针数组的概念 本期文章收录在《C语言进阶篇》大家有兴趣可以看看呐 ⛺️ 欢迎铁汁们 ✔️ 点赞 收藏 ⭐留言 注VS2022 等C语言学习工具都在《学习工具专栏》, 还有各种实用调试技巧有兴趣可以去看看 函数指针数组 ⛳️既然我们有指针数组的概念那么函数本身也是一个地址啊函数指针数组 和 指针数组只不过多了函数俩字 那么函数指针数组该如何定义呢 函数指针数组的定义 ⛳️假设我们要写一个计算器加减乘除4个部分的函数但是函数参数都是一样的。想把他放到一个函数指针数组里面该怎么办呢 函数指针我们知道怎么定义但是加了数组俩字该怎么定义呢? 代码演示
#include stdio.hint Sum(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 (*pf1)(int, int) Sum;int (*pf2)(int, int) Sub;int (*pf3)(int, int) Mul;int (*pf4)(int, int) Div;//函数指针数组int (*pfArr[4])(int, int) {Sum,Sub,Mul,Div};return 0;
}大家看函数指针数组就是这样定义的由于【】号的结合性比 * 号高所以 pfArr就先和【】号结合所以pfArr[ 4 ] 表示这个指针是个数组。 * 号则代表pfArr[ 4 ] 是个指针int(*)(int , int ) 代表了他是个函数指针类型的所以 nt (*pfArr[4])(int, int) 是函数指针数组类型的 函数指针数组的应用 —— 转移表 前面写的计算器如果按照我们以前思路写的代码会非常冗余那么我们学了函数指针数组有没有可能吧代码优化下嘛? 这时就要用到函数指针数组的应用 —— 转移表了我们来看一下 未改变前
#include stdio.hint Sum(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;
}void menu()
{printf(***********************\n);printf(***** 1:add 2:sub ***** \n);printf(***** 3:mul 4:div *****\n);printf(***** 0.exit *****\n);printf(***********************\n);
}
int main()
{int input 0;int x 0;int y 0;int ret 0;do{menu();printf(请输入-);scanf(%d, input);switch (input){case 1:printf(请输入俩个操作数);scanf(%d %d, x, y);ret Sum(x, y);printf(%d\n, ret);break;case 2:printf(请输入俩个操作数);scanf(%d %d, x, y);ret Sub(x, y);printf(%d\n, ret);break;case 3:printf(请输入俩个操作数);scanf(%d %d, x, y);ret Mul(x, y);printf(%d\n, ret);break;case 4:printf(请输入俩个操作数);scanf(%d %d, x, y);ret Div(x, y);printf(%d\n, ret);break;case 0:printf(退出计算器\n);break;default:printf(选择错误请重新输入!\n);break;}} while (input);return 0;
}代码改进 这里我们就带代码进行了改进使得main() 函数里面代码量大大减少。 这里由于我们选择时的数字要和数组下标一样所以我们填充一个空指针 NULL 让每个数组下标和我们的操作数对应 #include stdio.h
int Sum(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;
}void menu()
{printf(***********************\n);printf(***** 1:add 2:sub ***** \n);printf(***** 3:mul 4:div *****\n);printf(***** 0.exit *****\n);printf(***********************\n);
}
int main()
{int input 0;int x 0;int y 0;int ret 0;do{menu();printf(请输入-);scanf(%d, input);//函数指针数组 —— 转移表int(*pfArr[5])(int, int) {NULL ,Sum,Sub,Mul,Div};if (input 1 input 4){printf(请输入操作数);scanf(%d %d, x, y);ret pfArr[input](x, y);printf(%d\n, ret);}else if (input 0){return 0;}else{printf(选择错误请重新输入;\n);}} while (input);return 0;
}指向函数指针数组的指针 这里我们又进行了一遍套娃指针数组既然我们能接收那么。有没有指向函数指针数组的指针呢?答案是有的。 数组指针类型 int (*p)[ 5 ] 函数指针类型 int (*pf)(int, int) 函数指针数组类型 int (*pf [ 5 ])(int, int) 指向函数指针数组的指针 int (*(*pf)[ 5 ])(int, int) 这里我们可以怎么样理解呢首先在指向函数指针数组的指针不要硬写在我们函数指针数组的类型上进行改变
函数指针数组类型 int (*pf [ 5 ])(int, int) 我们首选需要一个指向函数指针数组的指针那么pf 就不能和左边的 * 结合 因为 int (* [ 5 ])(int, int) 代表了函数指针数组类型而我们想要接收他就需要一个指针 *pf那么把它括起来就是指向函数指针数组的指针了int (*(*pf)[ 5 ])(int, int) 代码演示 回调函数 ⛳️回调函数就是一个通过函数指针调用的函数。如果你把函数的指针地址作为参数传递给另一个函数当这个指针被用来调用其所指向的函数时我们就说这是回调函数。回调函数不是由该函数的实现方直接调用而是在特定的事件或条件发生时由另外的一方调用的用于对该事件或条件进行响应。 怎么应用呢函数指针的应用其实就是回调函数我们前面改进计算器的的时候用函数指针数组进行改进那么我们下面就对计算器用回调函数的方式进行改进 回调函数我的理解就是通过函数指针的方式接收函数的地址从而调用它。让一个函数可以调用多个同类型的函数的功能在特定的情况给我传输函数地址从而使用它。
上面计算器的实现用switch 语句实现的时候每一个case语句都是相同的除了函数的实现方法不同。这样就导致代码过于冗余 而这我们就可以用一个回调函数进行改进让这些代码都在一个函数里面。每次使用那个函数直接传送给我们的地址就行了 代码演示 这样铁汁们看是不是就避免的代码冗余的问题我们只需要把函数地址传过来就可以了输入什么选择就传什么函数从而去调用他 void calc(int (*pf)(int x, int y))
{int x 0;int y 0;printf(请输入操作数;);scanf(%d %d, x, y);int ret pf(x, y);printf(%d\n, ret);
}利用回调函数进行代码改进 代码演示
#include stdio.h
int Sum(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;
}void menu()
{printf(***********************\n);printf(***** 1:add 2:sub ***** \n);printf(***** 3:mul 4:div *****\n);printf(***** 0.exit *****\n);printf(***********************\n);
}
void calc(int (*pf)(int x, int y))
{int x 0;int y 0;printf(请输入操作数;);scanf(%d %d, x, y);int ret pf(x, y);printf(%d\n, ret);
}
int main()
{int input 0;do{menu();printf(请输入-);scanf(%d, input);switch (input){case 1:calc(Sum);break;case 2:calc(Sub);break;case 3:calc(Mul);break;case 4:calc(Div);break;case 0:printf(退出计算器\n);break;default:printf(选择错误请重新输入!\n);break;}} while (input);return 0;
}全篇总结
✅ 归纳 好了以上就是回调函数的使用和讲解以及函数指针数组的概念大家好好理解一下吧 函数指针数组 函数指针数组的使用 回调函数的概念 回调函数的应用 ☁️ 好了今天的知识全是干货不知道各位铁汁们学到了没有呢快拿去用吧 看到这里了还不给博主扣个 ⛳️ 点赞☀️收藏 ⭐️ 关注 ❤️ 拜托拜托这个真的很重要 你们的点赞就是博主更新最大的动力 有问题可以评论或者私信呢秒回哦。