【转移表】

文章目录

  • 一、函数指针数组
    • 1.什么事函数指针数组
    • 2.函数指针数组如何定义
  • 二、转移表
  • 结束语

一、函数指针数组

1.什么事函数指针数组

在我们学习函数指针数组前,大家可以一起回顾一下我们以前学习的指针和数组。

  1. 数组指针

数组指针是指指向数组的指针。

int arr[10]={0};
int *p[10]=&arr;
  1. 函数指针

函数指针是指向函数的指针

int Shan_shu(int a,int b)
int (*pa) (int,int)=Shan_shu;//pa是函数指针变量
  • 整形数组

是存放整形的数组

int  arr1[10]={1,2,3,4,5,6,7,8,9,10};
  • 指针数组

存放指针的数组

int *arr[10]   //整形指针数组
char*arr1[6]  //字符指针数组
  • 字符数组

存放字符的数组

char str[10]="hello ";

如果要把多个类型相同的函数指针存放在一个数组中,这就是函数指针数组。

2.函数指针数组如何定义

假如一个变量pa,pa先和[ ],说明pa是个数组,数组的内容就是int(*)()的函数指针。

比如我们写一个计算器(函数的形式),大多数情况下,许多人喜欢直接写:

#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 main()
{
	int ret = Add(8, 4);
	int ret1 = Sub(8, 4);
	int ret2 = Mul(8, 4);
	int ret3 = Div(8, 4);
	printf("%d \n", ret);
	printf("%d \n", ret1);
	printf("%d \n", ret2);
	printf("%d \n", ret3);

	return 0;
}

或者用函数指针形式代替上面的ret,即:

int (*pa)(int ,int)=Add;
int (*pa1)(int,int)=Sub;
int (*pa2)(int,int)=Mul;
int (*pa3)(int,int)=Div;

我们可以将上面用到函数指针数组来写:

#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 main()
{
	int(*parr[4])(int ,int) = { Add,Sub,Mul,Div };
	for (int i = 0; i < 4; i++)
	{
		int ret = parr[i](8, 4);

		printf("%d \n", ret);
	}
	return 0;
}

二、转移表

知道函数指针数组后,我们可以使用函数指针数组来写转移表。

计算器的⼀般实现:

#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 meun()
{
	printf("******************************\n");
	printf("*** 1.Add          2 .Sub  ***\n");
	printf("*** 3.Mul          4 .Div  ***\n");
	printf("*** 0.exist                ***\n");
	printf("******************************\n");

}
int main()
{
	int input = 0;
	do
	{
		int a = 0,b = 0;
		int ret = 0;
		meun();
		printf("请输入你的选择——>\n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("请输入两个数字:\n");
			scanf("%d%d", &a, &b);
			ret = Add(a, b);
			printf("%d\n", ret);
			break;
		case 2:
			printf("请输入两个数字:\n");
			scanf("%d%d", &a, &b);
			ret = Sub(a, b);
			printf("%d\n", ret);
			break;
		case 3:
			printf("请输入两个数字:\n");
			scanf("%d%d", &a, &b);
			ret = Mul(a, b);
			printf("%d\n", ret);
			break;
		case 4:
			printf("请输入两个数字:\n");
			scanf("%d%d", &a, &b);
			ret = Div(a, b);
			printf("%d\n", ret);
			break;
		case 0:
			printf("退出计算器\n");
			break;
		default:
			printf("输入错误,请重新输入——>\n");
			break;
		}
	} while (input);
}

上面的代码我们会觉得太过于冗余,还有当我们增加功能时,case也不断在增加,代码太长,所以这里我们可以用到函数指针数组来写:

我们只需要将主函数的修改即可,其他的无须变化。

int main()
{
	int a = 0, b = 0;
	int ret = 0;
	int input = 0;
	int(*parr[5])(int, int) = { NULL,Add,Sub,Mul,Div };
	do
	{
		meun();
		printf("请输入你的选择——>\n");
		scanf("%d", &input);
		if (input >= 1 && input <= 4)
		{
			printf("请输入两个数字:\n");
				scanf("%d%d", &a, &b);
			ret = (*parr[input])(a, b);
			printf("%d\n",ret);
		}
		else if (input == 0)
		{
			printf("退出计算器\n");
			break;
		}
		else
		{
			printf("输入错误,请重新输入——>\n");
		}
	} while (input);
}

int(*parr[5])(int, int) = { NULL,Add,Sub,Mul,Div };有空指针的原因是,在我们的菜单中,1代表的是加法,如果没有空指针,Add的下标不是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;
}
void meun()
{
	printf("******************************\n");
	printf("*** 1.Add          2 .Sub  ***\n");
	printf("*** 3.Mul          4 .Div  ***\n");
	printf("*** 0.exist                ***\n");
	printf("******************************\n");

}
int main()
{
	int a = 0, b = 0;
	int ret = 0;
	int input = 0;
	int(*parr[5])(int, int) = { NULL,Add,Sub,Mul,Div };
	do
	{
		meun();
		printf("请输入你的选择——>\n");
		scanf("%d", &input);
		if (input >= 1 && input <= 4)
		{
			printf("请输入两个数字:\n");
				scanf("%d%d", &a, &b);
			ret = (*parr[input])(a, b);
			printf("%d\n",ret);
		}
		else if (input == 0)
		{
			printf("退出计算器\n");
			break;
		}
		else
		{
			printf("输入错误,请重新输入——>\n");
		}
	} while (input);
}

结束语

今天的代码就到这里了,我们的指针快要结束了,差不多还要写一个博客,希望大家天天都要开心,热爱生活哟~
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/504461.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

每日五道java面试题之springboot篇(四)

目录&#xff1a; 第一题. Spring Boot 打成的 jar 和普通的 jar 有什么区别 ?第二题. 微服务中如何实现 session 共享 ?第三题. Spring Boot 中如何实现定时任务 ?第四题. 运行 Spring Boot 有哪几种方式&#xff1f;第五题. 开启 Spring Boot 特性有哪几种方式&#xff1f…

MySQL - 高阶语句(一)

先准备一张表 create table class1 (id int,name varchar(10) primary key not null ,score decimal(5,2),address varchar(20),hobbid int(5));insert into class1 values(1,liuyi,80,beijing,2); insert into class1 values(2,wangwu,90,shengzheng,2); insert into class1 …

Linux是怎么发送一个网络包的?

目录 摘要 1 从 send 开始 2 传输层 3 网络层 4 网络接口层 4.1 邻居子系统 4.2 网络设备子系统 4.3 软中断发送剩余的 skb 4.4 硬中断又触发软中断 总结 摘要 一个网络包的发送&#xff0c;始于应用层&#xff0c;经层层协议栈的封装&#xff0c;终于网卡。今天来循…

【C语言】贪吃蛇【附源码】

欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 一、游戏说明&#xff1a; 一个基于C语言链表开发的贪吃蛇游戏&#xff1a; 1. 按方向键上下左右&#xff0c;可以实现蛇移动方向的改变。 2. 短时间长按方向键上下左右其中之一&#xff0c;可实现蛇向该方向的短时间…

AndroidStudio出现类似 Could not create task ‘:app:ToolOperatorDemo.main()‘. 错误

先看我们的报错 翻译过来大概意思是:无法创建任务:app:ToolOperatorDemo.main()。 没有找到名称为“main”的源集。 解决方法&#xff1a; 在.idea文件夹下的gradle.xml文件中 <GradleProjectSettings>标签下添加<option name"delegatedBuild" value"f…

指针强化练习(详解)

更多学习内容 结构体内存对齐 和 位段-CSDN博客指针初级&#xff08;基础知识&#xff09;-CSDN博客指针进阶(深入理解)-CSDN博客 目录 1.sizeof与strlen的区别 2.一维数组 3.字符指针 4.二维数组 5.指针运算(笔试题) 6.函数指针 1.sizeof与strlen的区别 请思考以下运行结…

IntelliJ IDEA 2023 for Mac 好用的Java开发工具

IntelliJ IDEA 2023是一款由JetBrains开发的强大的集成开发环境&#xff08;IDE&#xff09;软件&#xff0c;适用于多个编程语言。它旨在提高开发人员的生产力和代码质量&#xff0c;具有以下多种特色功能&#xff1a; 软件下载&#xff1a;IntelliJ IDEA 2023 v2023.3.6中文激…

mixly编译esp32程序缺失问题bits/c++config.h

错误信息&#xff1a; 编译中... 使用平台的 ‘esp32’ 开发板&#xff0c;在列出的文件夹中&#xff1a;D:\windowsoftInstalled\mixly\mixly2.0-win32-x64\arduino-cli\Arduino15\packages\esp32\hardware\esp32\2.0.7 使用平台的 ‘esp32’ 代码&#xff0c;在列出的文件夹…

【MySQL】DQL-排序查询-语法&排序方式&注意事项&可cv例题语句

前言 大家好吖&#xff0c;欢迎来到 YY 滴MySQL系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C Linux的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…

使用python实现i茅台自动预约

使用python实现i茅台自动预约[仅限于学习,不可商用] 运行: 直接运行 imtApi.py 打包:切换到imt脚本目录,执行打包命令: pyinstaller --onefile imtApi.py这个应用程序可以帮助你进行茅台自动化配置。以下是一些使用说明: 平台注册账号(可用i茅台)不用登录,你可以进行…

【数据分析面试】5.地址信息数据清洗合并 (Python)

题目 有两个数据框。一个包含有关地址的信息&#xff0c;另一个包含了不同城市和州之间的关系。 示例&#xff1a; df_addresses address4860 Sunset Boulevard, San Francisco, 941053055 Paradise Lane, Salt Lake City, 84103682 Main Street, Detroit, 482049001 Casca…

hackmyvm———Quick4之tar命令注入

目录 1.信息收集 2.目录扫描 3.文件上传 ​4.提权 简介&#xff1a;HackMyVm是一个集合了大量靶机的平台&#xff0c;通过下载压缩包后导入Vm虚拟机来使用&#xff0c;推荐使用VirtualBox来导入加载漏洞虚拟机。类似于Vulnhub、HackTheBox&#xff0c;但是相比于Vulnhub而言…

利用TensorRT在jetson orin 上加速YOLOv5

一、第一种方法&#xff0c;需要下载各种包&#xff1a; 要用到一个大佬的开源&#xff0c;GitHub地址如下&#xff1a; https://github.com/wang-xinyu/tensorrtx/tree/master/yolov51. 安装pycuda&#xff0c;在线安装pycuda pip3 install pycuda 或者&#xff1a; sudo…

数据结构之单链表实现(JAVA语言+C语言)

一、理论 1 单链表结构 2 增、删、查 、改思路 &#xff08;增&#xff09;直接添加放到最后即可。按顺序添加&#xff1a;找到要修改的节点的前一个节点&#xff0c;插入新节点&#xff08;&#xff09;。&#xff08;改&#xff09;要修改的节点修改内容即可。&#xff08;…

STM32+ MAX30102通过指尖测量心率+血氧饱和度

一、前言 重要的事情放在最前面&#xff1a;max30102只适用于指尖手指测量&#xff0c;不适用与手腕手指测量&#xff0c;如需做成可穿戴样式选择传感器的小伙伴请pass掉他&#xff0c;因为他只有红光和红外2种光&#xff0c;不够充足的数据源去运算。 由于一些原因&#xff0c…

阿基米德分牛问题及其Python求解

文章目录 题目大意sympy求解结果 题目大意 问 太阳神有一牛群&#xff0c;由白、黑、花、棕四种颜色的公、母牛组成&#xff0c;其间关系如下&#xff0c;求每种牛的个数。 公牛中&#xff0c;白牛多于棕牛&#xff0c;二者之差为黑牛的 1 2 1 3 \frac{1}{2}\frac{1}{3} 21​…

排序——交换排序(冒泡排序与快速排序)

本专栏和大家分享关于排序的算法,其中有插入排&#xff08;直接插入排序和希尔排序&#xff09;、选择排序&#xff08;直接选择排序和堆排&#xff09;、交换排序&#xff08;冒泡排序和快速排序&#xff09;、归并排序以及其他非基于比较的排序 本文与大家分享交换排序 目录 …

SAP FICO 银企直联

银企直联是指企业通过互联网或专线连接的方式&#xff0c;使企业的SAP系统与商业银行的业务系统通过特定的数据接口实现连接&#xff0c;在SAP系统中可以直接查询银行账户的余额和明细&#xff0c;实现付款、银企对账、自动出具余额调节表等功能。 在这主要介绍SAP相关CALLSS配…

C++—vector的介绍及使用 vector的模拟实现

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 文章目录 前言 一、vector的介绍及使用 1.1 vector的介绍 1.2 vector的使用 1.2.1 vector的定义 1.2.2 vector iterator 的使用 1.2.3 vector 空间增长问题 1.2.4 vecto…

Python绘制线图之plt.plot()的介绍以及使用

在Python中plt.plot是matplotlib库中的一个函数,用于绘制点和线,并对其样式进行控制,下面这篇文章主要给大家介绍了关于Python绘制线图之plt.plot()的介绍以及使用的相关资料,需要的朋友可以参考下 plt.plot() 是Matplotlib库中用于绘制线图&#xff08;折线图&#xff09;的主…