> 文章列表 > 指针的进阶【下篇】

指针的进阶【下篇】

指针的进阶【下篇】

文章目录

  • 📀8.指向函数指针数组的指针
  • 📀9.回调函数


在这里插入图片描述

📀8.指向函数指针数组的指针

🌰请看代码与注释👇

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[4])(int, int) = { Add,Sub };int (*(*ppfArr)[4])(int, int) = &pfArr;//ppfArr 是一个指向函数数组的指针return 0;
}

📀9.回调函数

💡回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

🌰举个例子👇

💡还是一个简易计算器👇

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 menu()
{printf("\\n");printf("    1.add        2.sub     *\\n");printf("    3.mul        4.div     *\\n");printf("          5.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 = Add(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;
}

☝️虽然可以很好的运行出来,但是看一下这段代码是不是有些冗余🥺
指针的进阶【下篇】
大部分代码都是重复的,只有调用执行 + - * / 运算的时候不一样,那么我们可不可以把这每段重复的部分封装成一个函数呢❓

我们来进行优化改装一下👇

void Calc(int(*pf)(int, int))
{int x = 0;int y = 0;int ret = 0;printf("请输入两个操作数:>");scanf("%d %d", &x, &y);ret = pf(x, y);printf("%d\\n", ret);
}

💡 我们把每次输入输出 执行运算封装成这样的一个函数,只保留一个,使用函数指针来接收
💡 优化后的源码👇

#include<stdio.h>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 menu()
{printf("\\n");printf("    1.add        2.sub     *\\n");printf("    3.mul        4.div     *\\n");printf("          5.exit           *\\n");printf("\\n");
}
void Calc(int(*pf)(int, int))
{int x = 0;int y = 0;int ret = 0;printf("请输入两个操作数:>");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:Calc(Add);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;
}

指针的进阶【下篇】

🥰可能有那么一点点复杂,希望烙铁们能够理解‼️🥰

总结🥰
以上就是 指针的进阶【下篇】 内容啦🥳🥳🥳🥳
本文章所在【C语言知识篇】专栏,感兴趣的烙铁可以订阅本专栏哦🥳🥳🥳
希望我们可以做一个用心的人💕💕💕
小的会继续学习,继续努力带来更好的作品😊😊😊
创作写文不易,还多请各位大佬uu们多多支持哦🥰🥰🥰

指针的进阶【下篇】