当前位置: 首页 > news >正文

深⼊理解指针(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;
}

相关文章:

  • 解决 Oracle EXPDP 無法鎖定 NFS 相關錯誤: ORA-27086 flock: No locks available
  • HTTP知识速通
  • Python 函数装饰器和闭包(装饰器基础知识)
  • 文献阅读篇#5:5月一区好文阅读,BFA-YOLO,用于建筑信息建模!(上)
  • 新一代机载相控阵雷达的发展
  • 「Mac畅玩AIGC与多模态12」开发篇08 - 使用自定义汇率查询插件开发智能体应用
  • 【 Node.js】 Node.js安装
  • Java 期中考试练习题
  • 【速写】prune与activate
  • 解决Win10虚拟机“网络连接不上”,“Ethernet0 网络电缆被拔出”的问题
  • PB的框架advgui反编译后控件无法绘制的处理(即导入pbx的操作步骤)
  • 【漫话机器学习系列】234.阈值类特征的方差分析(Thresholding Categorical Feature Variance)
  • 分布式锁的几种实现
  • 【MySQL数据库】视图
  • ESP-ADF esp_dispatcher组件之audio_service子模块连接管理函数详解
  • 艾尔登法环最新3000+MOD大型整合包 5月最新更新
  • 伽利略如何测量光速?一场跨越山头的失败实验
  • 用spring-boot-maven-plugin打包成单个jar有哪些缺点优化方案
  • 最长公共前缀(14)
  • 【STM32】ADC的认识和使用——以STM32F407为例
  • 央行就《关于规范供应链金融业务引导供应链信息服务机构更好服务中小企业融资有关事宜的通知》答问
  • “女乘客遭顺风车深夜丢高速服务区”续:滴滴永久封禁两名涉事司机账号
  • “五一”假期逛上海车展请提前购票,展会现场不售当日票
  • 普京与卢卡申科举行会晤,将扩大在飞机制造等领域合作
  • 80后共青团云南省委副书记许思思已任迪庆州委副书记
  • 贵州茅台一季度净利268亿元增长11.56%,系列酒营收增近两成