深⼊理解指针(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.mzph.cn/news/903728.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

neo4j暴露公网ip接口——给大模型联通知识图谱

特别鸣谢 我的领导&#xff0c;我的脑子&#xff0c;我的学习能力&#xff0c;感动了 1. 搭建知识图谱数据库&#xff08;见上一章博客&#xff09; 这里不加赘述了&#xff0c;请参考上一篇博客搭建 2. FastApi包装接口 这里注意&#xff1a;NEO4J_URI不得写http:,只能写…

AI编程新选择!VSCode + RooCode,超越Cursor​

在当今快节奏的开发环境中&#xff0c;AI编程助手已经成为提升开发效率的关键工具。然而&#xff0c;面对众多选择&#xff0c;开发者往往陷入纠结&#xff1a;如何在众多AI编程工具中找到最适合自己的方案&#xff1f;尤其是当VSCode搭配RooCode时&#xff0c;相比Cursor&…

电子病历高质量语料库构建方法与架构项目(环境聆听与自动化文档生成篇)

电子病历高质量语料库的构建是一个复杂而系统的工程,涉及数据收集、清洗、标注、验证等多个环节。在项目实施过程中,"环境聆听"和"自动化文档生成"是两个关键支撑要素,前者确保项目能够适应不断变化的技术和业务环境,后者则保障项目过程的可追溯性和知…

Python协程入门指北

一、什么是协程&#xff1f; 协程&#xff08;Coroutine&#xff09;就像可以暂停执行的函数&#xff0c;能够在执行过程中主动让出控制权&#xff0c;等准备好后再继续执行。 生活小例子 想象你在咖啡店排队&#xff1a; 普通函数&#xff1a;必须一直排到取餐&#xff08…

mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz的下载安装和使用

资源获取链接&#xff1a; mysql-5.7.24-linux-glibc2.12-x86-64.tar.gz和使用说明资源-CSDN文库 详细作用 数据库服务器的核心文件&#xff1a; 这是一个压缩包&#xff0c;解压后包含 MySQL 数据库服务器的可执行文件、库文件、配置文件模板等。 它用于在 Linux 系统上安装…

C++笔记-继承(下)(包含派生类的默认成员函数,菱形继承等)

一.派生类的默认成员函数 1.14个常见默认成员函数 默认成员函数&#xff0c;默认的意思就是指我们不写&#xff0c;编译器会自动为我们生成一个&#xff0c;那么在派生类中&#xff0c;这几个成员函数是如何生成的呢&#xff1f; 1.派生类的构造函数必须调用基类的构造函数初…

C++中指针使用详解(3)数组、指针和函数参数传递的底层 ABI实现

要深入理解 数组、指针和函数参数传递 的底层 ABI&#xff08;Application Binary Interface&#xff09;实现&#xff0c;需要从以下几个维度出发进行学习&#xff1a; 一、什么是 ABI&#xff1f; ABI 是编译器和操作系统之间的协定&#xff0c;规定了&#xff1a; 函数如何…

【RustDesk 】中继1:压力测试 Python 版 RustDesk 中继服务器

测试 Python 版 RustDesk 中继服务器 测试我们实现的中继服务器有几种方法,从简单到复杂依次如下: 1. 基本连接测试客户端 创建一个简单的测试客户端来验证中继服务器的基本功能: 2. 用两个测试客户端测试中继功能 要测试完整的中继功能,你需要运行两个客户端实例来模拟…

Spring Boot集成Spring Cloud 2024(不使用Feign)

本文介绍Spring Boot集成Spring Cloud 2024&#xff0c;且不使用Feign&#xff0c;而是采用Spring 6自带的HttpExchange方式进行服务调用的详细步骤&#xff1a; 环境准备 Spring Boot版本&#xff1a;推荐使用Spring Boot 3.4.1及以上版本&#xff0c;以更好地与Spring Clou…

vue中$set原理

Vue 中的 $set 方法&#xff08;Vue.set&#xff09;主要用于 向响应式对象中添加一个新的属性&#xff0c;并确保这个新属性是响应式的&#xff0c;能够触发视图更新。 &#x1f4cc; 背景问题&#xff1a;为什么需要 $set&#xff1f; 在 Vue 2 中&#xff0c;直接给对象新增…

Superset二次开发之深度解读系列:1.概述

Apache Superset 是一款现代化的企业级商业智能 Web 应用程序&#xff0c;专为数据探索和可视化而设计。本概述介绍了 Superset 的架构、核心组件和主要功能&#xff0c;以帮助开发人员了解该系统的工作原理。 What is Apache Superset? Apache Superset 是一个开源数据探索…

Linux系统之elfedit详解

elfedit 是一个用于修改 ELF&#xff08;可执行与可链接格式&#xff09;文件头的工具。它允许用户根据指定的条件&#xff08;如机器类型、文件类型、操作系统/ABI&#xff09;匹配并更新 ELF 文件的头部信息。支持 32 位和 64 位 ELF 文件&#xff0c;以及包含 ELF 文件的归档…

前端HTML基础知识

1.HTML介绍 HTML(HyperText Markup Language&#xff0c;超文本标记语言)是构成网页的基本元素&#xff0c;是一种用于创建网页的标准化标记语言。HTML不是一种编程语言&#xff0c;而是一种标记语言&#xff0c;通过标签来描述网页的结构和内容。 超文本&#xff1a;超文本是…

【IP101】图像滤波技术详解:从均值滤波到高斯滤波的完整指南

&#x1f31f; 图像滤波魔法指南 &#x1f3a8; 在图像处理的世界里&#xff0c;滤波就像是给图片"美颜"的魔法工具。让我们一起来探索这些神奇的滤波术吧&#xff01; &#x1f4d1; 目录 1. 均值滤波&#xff1a;图像的"磨皮"大法2. 中值滤波&#xff1…

LINE FRIENDS 正式与 Walrus 合作,全新 AI 驱动的游戏即将上线

风靡全球的 LINE FRIENDS 角色即将以“minini”迷你造型登陆 Walrus&#xff0c;虽然尺寸更小&#xff0c;但承诺带来“大”动作。IPX&#xff08;LINE FRIENDS 背后的公司&#xff09;打造了《minini universe: ROOM》游戏&#xff0c;这是一款基于其 minini 系列角色的多链游…

2025年信息素养大赛C++算法创意实践挑战赛初赛样题及答案解析(小学组)

一、选择题 1、下列代码&#xff0c;能够输出 hello world 的是_____ A. cout (hello world) B. cout << hello world C. cout:hello world D. cout << "hello world"; 答案&#xff1a;D 解析&#xff1a;cout输出的文本内容要用双引号引起来 2、…

[c语言日寄]检查环形链表

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还是…

黄雀在后:外卖大战新变局,淘宝+饿了么开启电商大零售时代

当所有人以为美团和京东的“口水战”硝烟渐散&#xff0c;外卖大战告一段落时&#xff0c;“螳螂捕蝉&#xff0c;黄雀在后”&#xff0c;淘宝闪购联合饿了么“闪现”外卖战场&#xff0c;外卖烽火再度燃起。 4 月30日&#xff0c;淘宝天猫旗下即时零售业务“小时达”正式升级…

如何在uni-app中自定义输入框placeholder的样式

在开发uni-app应用时&#xff0c;我们经常需要自定义输入框&#xff08;<input>&#xff09;的样式以匹配应用的整体设计。默认情况下&#xff0c;uni-app的输入框提供了一些基本的样式选项&#xff0c;但有时候我们需要更细致地控制输入框的每个部分&#xff0c;例如pla…

使用Node编写轻量级后端快速入门

使用Node编写轻量级后端快速入门 node 要作为轻量级后端需要下载一些对应模块可以参考下面命令。你可以借助 npm&#xff08;Node Package Manager&#xff09;来下载它们。 模块下载 express&#xff1a;这是一个广受欢迎的 Node.js Web 应用框架&#xff0c;能用于构建 Web…