目录
🔊🔊🔊
🇨🇳大家好,我是_奇奇,暂时为一名C语言博主。河牧院大一在读。
🔔喜欢交朋友,欢迎大家和我一起交流学习
❤️编程的前途是光明的,道路是曲折的。笑到最后才是赢家🍺
🌳我觉得坦途在前,人又何必为了一些小障碍而不走路呢 --鲁迅
0.前言
- 学了这么长时间指针了,还不知道怎么用。但今天终于可以体现一下指针的优越性了。这篇博客我将用函数指针来实现加减乘除等简单的运算来模拟计算。来学习函数指针的优越性。
函数指针可以使计算器代码变的简洁不冗余。 - 先普及几个需要用到的英语。(英语大佬自行略过)
addition 加法 缩写 Add
subtraction 减法 缩写 Sub
multiplication 乘法 缩写 Mul
division 除法 缩写 Div
calculator 计算器 缩写 Cal
- 假如让你写一个计算器你会怎么写?很自然的你会想到把加减乘除等运算分别封装成函数然后需要用哪个操作的时候依次去调用他们。所以你的代码逻辑可能就是以下特别冗余的这个。
- 创建一个菜单进行选择去执行哪个操作。然后输入两个操作数进行计算。
1.普通冗余代码
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> menu() { printf("******1.加法*******\n"); printf("******2.减法*******\n"); printf("******3.乘法*******\n"); printf("******4.除法*******\n"); } Add(int x, int y) { return x + y; } Sub(int x, int y) { return x - y; } Mul(int x, int y) { return x * y; } Div(int x, int y) { return x / y; } int main() { int n = 0; int x = 0; int y = 0; int result = 0; do { menu(); scanf("%d", &n); switch (n) { case 1: printf("请输入两个操作数\n"); scanf("%d %d", &x, &y); result = Add(x, y); printf("结果是%d\n", result); break; case 2: printf("请输入两个操作数\n"); scanf("%d %d", &x, &y); result = Sub(x, y); printf("结果是%d\n", result); break; case 3: printf("请输入两个操作数\n"); scanf("%d %d", &x, &y); result = Mul(x, y); printf("结果是%d\n", result); break; case 4: printf("请输入两个操作数\n"); scanf("%d %d", &x, &y); result = Div(x, y); printf("结果是%d\n", result); break; case 0: printf("退出计算器\n"); break; default: printf("选择错误,请重新选择\n"); break; } } while (n); return 0; }
看以下图片。你会发现除了每次调用的函数名不一样以外,其他的全部是一模一样的,所以我们可以把这部分想方设法封装成一个函数。但由于函数名不一样,所以没办法封装!这时候函数指针就派上用场啦。
可以把重复的部分抽离出来编成一个Cal
函数,然后Cal
函数的参数用函数指针int (*p)(int, int)
来接收加法Add
,减法Sub
,乘法Mul
,或者除法Div
的函数名。然后在这个函数内部调用需要用到的 加减乘除 函数。
2.整体改进代码
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> menu() { printf("******1.加法*******\n"); printf("******2.减法*******\n"); printf("******3.乘法*******\n"); printf("******4.除法*******\n"); } Add(int x, int y) { return x + y; } Sub(int x, int y) { return x - y; } Mul(int x, int y) { return x * y; } Div(int x, int y) { return x / y; } Cal(int (*p)(int, int)) { int x = 0; int y = 0; int result = 0; printf("请输入两个操作数\n"); scanf("%d %d", &x, &y); result = p(x, y); printf("结果是%d\n", result); } int main() { int n = 0; do { menu(); scanf("%d", &n); switch (n) { case 1: Cal(Add); break; case 2: Cal(Sub); break; case 3: Cal(Mul); break; case 4: Cal(Div); break; case 0: printf("退出计算器\n"); break; default: printf("选择错误,请重新选择\n"); break; } } while (n); return 0; }
3.具体改进分析(画图分析)
- 如图所示,本质是回调函数
2.回调函数就是一个被作为参数传递的函数。回调函数的使用可以大大提升编程的效率,这使得它在现代编程中被非常多地使用。同时,有一些需求必须要使用回调函数来实现。(百度百科)