当前位置: 首页 > 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;
}

http://www.xdnf.cn/news/247483.html

相关文章:

  • 简单的Qwen3的本地部署、分析与常见报错
  • Cribl 数据脱敏 更多方法 MASK (三)
  • 第十六届 -- 蓝桥杯Web开发大学组省赛个人复盘
  • ESP-ADF esp_dispatcher组件之audio_service子模块资源管理函数详解
  • RAGFlow上传3M是excel表格到知识库,提示上传的文件总大小过大
  • 基于Redis实现-附近商铺查询
  • UE实用地编插件Physical Layout Tool
  • MySQL | DQL语句-连接查询
  • linux 使用nginx部署next.js项目,并使用pm2守护进程
  • 加载ko驱动模块:显示Arm版本问题解决!
  • 小白如何入门Python爬虫
  • 【playwright】内网离线部署playwright
  • PMP-第九章 项目资源管理(一)
  • 机器学习实操 第一部分 机器学习基础 第8章 降维技术
  • 深度学习中卷积的计算复杂度与内存访问复杂度
  • 数字基带信号和频带信号的区别解析
  • ES6异步编程中Promise与Proxy对象
  • 小牛电动:荣登央视舞台,引领智能出行新潮流
  • c++26新功能——std::execution
  • 加密算法(一)-对称加密(DES、AES、3DES、Blowfish、Twofish)一篇了解所有主流对称加密,轻松上手使用。
  • mysql-窗口函数一
  • 链表系列一>合并 k 个升序链表
  • 【CV数据集】DIOR遥感目标检测数据集(含处理好的YOLO、COCO、VOC格式和相关配置文件下载链接)
  • 响应式布局,在飞帆平台中如此简单
  • 文件包含漏洞学习
  • PostgreSQL:pgAdmin 4 使用教程
  • 手撕哈希表
  • Android 移动开发:ProgressBar (水平进度条)
  • 【LeetCode Hot100】回溯篇
  • cua: 为 AI 智能体提供高性能虚拟环境