站点创建,常州做集装箱的公司,怎么开发一款app软件,网站登录入口网页大家好#xff0c;我是苏貝#xff0c;本篇博客带大家了解指针(2)#xff0c;如果你觉得我写的还不错的话#xff0c;可以给我一个赞#x1f44d;吗#xff0c;感谢❤️ 目录 一.函数指针数组二.指向函数指针数组的指针#xff08;不重要#xff09;三.回调函数 一.函… 大家好我是苏貝本篇博客带大家了解指针(2)如果你觉得我写的还不错的话可以给我一个赞吗感谢❤️ 目录 一.函数指针数组二.指向函数指针数组的指针不重要三.回调函数 一.函数指针数组
字符数组–数组–存放字符的数组 整型数组–数组–存放整型的数组 指针数组–数组–存放指针的数组 函数指针数组–数组–存放函数指针的数组即存放函数的地址 int (* parr1[10])(); parr1 先和 [ ] 结合说明 parr1是数组数组的元素类型是什么呢将数组名和数组名后面的[ ] 去掉得到int (* )()即函数指针所以数组的元素类型是函数指针 函数指针数组的用途转移表 例子计算器实现 - * / 4个功能
#includestdio.hvoid 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 ret 0;do{menu();printf(请选择);scanf(%d, input);switch (input){case 1:printf(请输入2个数);scanf(%d %d, x, y);ret Add(x, y);printf(%d\n, ret);break;case 2:printf(请输入2个数);scanf(%d %d, x, y);ret Sub(x, y);printf(%d\n, ret);break;case 3:printf(请输入2个数);scanf(%d %d, x, y);ret Mul(x, y);printf(%d\n, ret);break;case 4:printf(请输入2个数);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;
}但是写完这些代码后我们发现这些代码有许多重复的地方所以我们是否可以简化一下呢
简化上面的代码我们发现Add,Sub,Mul,Div的参数类型和个数相同返回类型也相同所以可以使用函数指针数组让Add,Sub,Mul,Div成为该数组的元素用数组的元素调用Add,Sub,Mul,Div函数 int(*pfArr [ ])(int, int) { Add,Sub,Mul,Div }; 所以它们的下标分别为0123但由于菜单上1234才代表它们所以我们不妨在Add前加NULL这样它们的下标就为1234了 int(*pfArr[])(int, int) { NULL,Add,Sub,Mul,Div }; 总代码
#includestdio.hvoid 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 ret 0;do{menu();printf(请选择);scanf(%d, input);int(*pfArr[])(int, int) { NULL,Add,Sub,Mul,Div };if (0 input)printf(退出程序\n);else if (input 1 input 4){printf(请输入2个数);scanf(%d %d, x, y);ret pfArr[input](x, y);printf(%d\n, ret);}elseprintf(输入错误请重新输入\n);} while (input);return 0;
}上述代码也有缺陷因为要写成数组元素的话它们的类型必须要相同如果有一个函数它的返回类型不是int那就不能采用这种方法
二.指向函数指针数组的指针不重要
经过上面的学习我们可以知道指向函数指针数组的指针是一个 指针指针指向一个 数组 数组的元素都是 函数指针那指向函数指针数组的指针该如何定义呢 void(*(*p)[2])(int, int); p先与 * 结合代表p是个指针再与[ ]结合表示p指向的是个数组将( * p)[2]去掉得到void( *)(int, int)是函数指针所以数组的元素类型是函数指针 int Add(int x, int y)
{return x y;
}int Sub(int x, int y)
{return x - y;
}int main()
{//函数指针int (*pf)(int, int) Add;//函数指针数组int (*pfArr[2])(int, int) { Add,Sub };//指向函数指针数组的指针int(*(*p)[2])(int, int);return 0;
}三.回调函数
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针地址作为参数传递给另一个函数当这个指针被用来调用其所指向的函数时我们就说这是回调函数。回调函数不是由该函数的实现方直接调用而是在特定的事件或条件发生时由另外的一方调用的用于对该事件或条件进行响应
例子计算器将上面最开始的计数器代码优化 我们可以看出上面红色框里面的大部分代码都冗余那我们能否使用一个函数cacl达到实现 - * / 4个功能的目的呢
思路将实现 - * / 4个功能的函数作为函数cacl的形参用一个函数指针来接收
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;
}void cacl(int (*pf)(int, int))
{int x 0;int y 0;int ret 0;printf(请输入2个数);scanf(%d %d, x, y);ret pf(x, y);printf(%d\n, ret);
}int main()
{int input 0;do{menu();printf(请选择);scanf(%d, input);switch (input){case 1:cacl(Add);break;case 2:cacl(Sub);break;case 3:cacl(Mul);break;case 4:cacl(Div);break;case 0:printf(退出程序\n);break;default:printf(选择错误请重新选择\n);break;}} while (input);return 0;
}
先使input2所以选择的是减法输入使得x10,y2通过函数指针pf找到Sub函数返回8用ret接收最后输出ret 好了那么本篇博客就到此结束了如果你觉得本篇博客对你有些帮助可以给个大大的赞吗感谢看到这里我们下篇博客见❤️