深⼊理解指针(8)
1.对上一篇的补充内容
typedef int* ptr_t
#define PTR_T int*
这两种写法都是可以的
ptr_t p1, p2;
//p1, p2 都是指针变量
PTR_T p3, p4;
//p3 是指针变量, p4是整型变量
为什么p3 是指针变量, p4是整型变量呢?
因为PTR_T 真的被改为了 int*
在编译器中是这样解读的
替换后int * p3, p4;中 * 给 p3 用了
2.函数指针数组
int * arr [5];
//arr是指针数组 —— 存放的是指针
如果我们有4个函数的地址,要把函数的地址存到⼀个数组中,那这个数组就叫函数指针数组,那函数指针的数组如何定义呢?
现在有四组函数,如图:
定义如下图代码所示:
3.函数指针数组的小练习
对上述的代码进行应用:
4组函数部分不变,对代码进行如下补充:
运行结果如下:
进行8 , 4 的 4 种函数运算
4.用途:转移表
函数指针数组的⽤途:转移表
首先我们编写一段简易的计算器代码,如下图所示:
运行结果如下:
以上是两个整数的运算,完成的加减乘除运算
但是!
如果要计算其他运算,就要对现在的代码进行补充 case 的语句会越来越长,那么我们有没有办法简化代码呢?
如下所示:
函数与菜单部分一样
修改部分如下所示:
当增加算法时:
增加函数、修改菜单、再在函数指针数组种加入函数名、再修改循环中的数据即可。
本篇文章中所有用到的代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#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;
//}
//
int (*)(int,int)
//
//int main()
//{
// int (*pf1)(int,int) = Add;
// //pf1是函数指针变量
// int (*pfarr[4])(int, int) = {Add,Sub,Mul,Div};
// //pfarr是函数指针数组
// //8 4
// int i = 0;
// for (i = 0; i < 4; i++)
// {
// int r = pfarr[i](8, 4);
// printf("%d\n", r);
// }
// return 0;
//}//计算器
//完成整数的加减乘除运算//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 ************\n");
// printf("*********** 2.sub ************\n");
// printf("*********** 3.mul ************\n");
// printf("*********** 4.div ************\n");
// printf("*********** 0.exit ************\n");
// printf("************************************\n");
//}
//
//int main()
//{
// int input = 0;
// int x = 0;
// int y = 0;
// int z = 0;
// do
// {
// menu();
// printf("请选择:");
// scanf("%d ", &input);
// switch (input)
// {
// case 1:
// printf("请输入两个操作数:");
// scanf("%d %d", &x, &y);
// z = Add(x, y);
// printf("%d\n", z);
// break;
// case 2:
// printf("请输入两个操作数:");
// scanf("%d %d", &x, &y);
// z = Sub(x, y);
// printf("%d\n", z);
// break;
// case 3:
// printf("请输入两个操作数:");
// scanf("%d %d", &x, &y);
// z = Mul(x, y);
// printf("%d\n", z);
// break;
// case 4:
// printf("请输入两个操作数:");
// scanf("%d %d", &x, &y);
// z = Div(x, y);
// printf("%d\n", z);
// break;
// case 0:
// printf("退出计算器\n");
// break;
// default:
// printf("选择错误\n");
// break;
// }
// } while (input);
// return 0;
//}//简化代码
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 ************\n");printf("*********** 2.sub ************\n");printf("*********** 3.mul ************\n");printf("*********** 4.div ************\n");printf("*********** 0.exit ************\n");printf("************************************\n");
}int main()
{int input = 0;int x = 0;int y = 0;int z = 0;//再这里创建一个函数指针的数组//int (*pfArr[4])(int, int) = { Add, Sub, Mul, Div };// 下标: 0 1 2 3//和菜单不匹配int (*pfArr[5])(int, int) = { 0, Add, Sub, Mul, Div };// 下标: 0 1 2 3 4do{menu();printf("请选择:");scanf("%d ", &input);//3if (input >= 1 && input <= 4){printf("请输入两个操作数:");scanf("%d %d", &x, &y);z = pfArr[input](x, y);printf("%d\n", z);}else if (input == 0){printf("退出计算器\n");}else{printf("选择错误\n");}} while (input);return 0;
}