深⼊理解指针(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;
}
相关文章:
深⼊理解指针(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* 在编译器中…...
【iview】icon样式
A. 工程中引入样式文件 iview源码工程中的example工程中如何引入iview样式 image.png 自定义工程中如何引入iview样式 一般在src/main.js中引入(在index.html中也可以,当然app.vue中也可以) import "iview/dist/styles/iview.css"B…...
【计算机视觉】三维视觉:Nerfstudio:模块化神经辐射场框架的技术突破与实战指南
深度解析Nerfstudio:模块化神经辐射场框架的技术突破与实战指南 技术架构与核心创新系统架构设计关键技术特性 环境配置与安装指南硬件要求全平台安装流程 实战全流程解析1. 数据采集与预处理2. 模型训练与优化3. 可视化与导出 核心技术深度解析1. 混合表示网络2. 渐…...
第二章 OpenCV篇-图像阈值的综合操作-Python
目录 一.图像阈值 二.图像平滑 1.均值滤波 2.方框滤波 3.高斯滤波 4.中值滤波 5.双边滤波 此章节主要讲解:图像阈值、图像平滑处理、均值滤波、方框滤波、高斯滤波、中值滤波、双边滤波。 这里先讲作者使用matplotlib模块出现错误的解决方法。 首先作者在这…...
WPF处理大规模激光数据计算与安全传输处理
WPF大规模激光数据处理与安全传输系统设计方案 一、系统架构设计 1. 整体架构 ┌─────────────────────────────────────────────┐ │ WPF客户端应用 │ ├───────────────┬…...
vue 常见ui库对比(element、ant、antV等)
Element UI 1. 简介 Element UI 是一个基于 Vue 2 和 Vue 3 的企业级 UI 组件库,提供了丰富的组件和主题定制功能。官方网站:Element UI 2. 主要特点 丰富的组件:包括表单、表格、布局、导航、弹窗等多种组件。主题定制:支持主…...
【c++】【STL】stack详解
目录 stack类的作用什么是容器适配器stack的接口构造函数emptysizetoppushpopswap关系运算符重载 stack类的实现 stack类的作用 stack是stl库提供的一种容器适配器,也就是我们数据结构中学到的栈,是非常常用的数据结构,特点是遵循LIFO&#…...
单片机-89C51部分:12 pwm 呼吸灯 直流电机
飞书文档https://x509p6c8to.feishu.cn/wiki/JkzfwSoFBiUKc4kh8IoccTfyndg 一、什么是PWM? PWM是脉冲宽度调制的缩写,它是一种通过调整脉冲信号的高电平和低电平时间比例来控制电路输出的技术。简单来说,PWM是一种控制电子设备输出电压或电…...
WPF实现数据库操作与日志记录
1. 数据库操作实现 1.1 数据库连接基类 public abstract class DatabaseBase : IDisposable {protected string ConnectionString { get; }protected IDbConnection Connection { get; private set; }protected DatabaseBase(string connectionString){ConnectionString = co…...
用spring-boot-maven-plugin打包成单个jar有哪些缺点优化方案
Spring Boot 的 Fat JAR(通过 spring-boot-maven-plugin 打包)虽然简化了部署,但也存在一些潜在缺点,需根据场景权衡: 1. 启动速度较慢 原因: Fat JAR 需要在启动时解压并加载所有依赖的 JAR 文件到类路径…...
Spring Boot 使用 WebMagic 爬虫框架入门
1. 创建 Spring Boot 项目 使用 Spring Initializr 创建一个 Spring Boot 项目,选择需要的依赖,如 Spring Web 等。 2. 添加 WebMagic 依赖 在项目的 pom.xml 文件中添加 WebMagic 的核心和扩展依赖: <dependency><groupId>u…...
【软件设计师:复习】上午题核心知识点总结(二)
一、计算机网络(常考) 1.网络模型与协议(必考) 1.OSI七层模型 vs. TCP/IP四层模型 OSI七层TCP/IP四层核心协议/设备功能应用层(Application)应用层HTTP、FTP、DNS、SMTP提供用户接口和服务表示层(Presentation)SSL/TLS、JPEG、ASCII数据格式转换、加密/解密会话层(S…...
TensorRt10学习第一章
建立TensorRt时必须要有Public ILogger,因为createInferBuiler和createruntime要用,是一个接口 出错打印 和...
【LeetCode Hot100】回溯篇
前言 本文用于整理LeetCode Hot100中题目解答,因题目比较简单且更多是为了面试快速写出正确思路,只做简单题意解读和一句话题解方便记忆。但代码会全部给出,方便大家整理代码思路。 46. 全排列 一句话题意 给定一个无重复数字的序列…...
Go 语言中一个功能强大且广泛使用的数据验证库github.com/go-playground/validator/v10
github.com/go-playground/validator/v10 是 Go 语言中一个功能强大且广泛使用的数据验证库,主要用于对结构体字段进行数据校验,确保数据的合法性和完整性。以下是其核心作用、使用场景及代码案例的详细说明: 核心作用 数据校验 支持对结构体…...
Java 多线程进阶:线程安全、synchronized、死锁、wait/notify 全解析(含代码示例)
在 Java 并发编程中,“线程安全” 是核心议题之一。本文将深入讲解线程安全的实现手段、synchronized 的使用方式、可重入锁、死锁的成因与避免、wait/notify 通信机制等,并配合实际代码案例,帮助你彻底搞懂 Java 线程协作机制。 一、线程安全…...
windows电脑端SSH连接开termux的安卓端
(确保你此前已经安装好了ssh)在手机termux当中输入: 查看状态:ssh 启动服务:sshd 查看IP:ifconfig 然后在电脑端:...
Java 期中考试练习题
一、引言 Java 作为一门广泛应用的编程语言,在计算机相关专业的课程体系中占据重要地位。期中考试是检验同学们对 Java 知识掌握程度的重要环节。本文将呈现一些典型的 Java 期中考试试题,并进行详细讲解,希望能帮助大家更好地理解和掌握 Ja…...
【Unity】 组件库分类详解
1️⃣ Audio(音频组件) 用于处理游戏中的声音。 Audio Source 读音[ˈɔːdiəʊ ˈsɔːs],音频源组件,用于播放音频文件,可设置音量、Pitch、循环播放等属性,是音频播放的核心组件。 Audio Listener 读音…...
Java 中使用正则表达式
1. 引入包 在使用正则表达式之前,需要引入包: import java.util.regex.Matcher; import java.util.regex.Pattern; 2. 常用模式规则 元字符 :这些是正则表达式中的特殊字符,用于匹配特定的模式。 . :匹配任意单个字…...
如何降低LabVIEW开发费用
在 LabVIEW 开发过程中,开发费用是用户和开发者共同关注的重点。过高的开发成本可能会压缩项目利润空间,甚至影响项目的可行性。下面将介绍降低 LabVIEW 开发费用的有效方法。 合理规划项目需求,避免后期增加 在项目启动阶段ÿ…...
WPF使用SQLSugar和Nlog
WPF应用中使用SQLSugar和NLog实现数据库操作与日志记录 1. 准备工作 首先,通过NuGet安装必要的包: Install-Package SQLSugarCore Install-Package NLog Install-Package NLog.Config Install-Package NLog.Targets.File 2. 配置NLog 在项目中添加nlog.config文件: <…...
Python10天冲刺-设计模型之策略模式
策略模式是一种行为设计模式,它允许你在运行时动态地改变对象的行为。这种模式的核心思想是将一组相关的算法封装在一起,并让它们相互替换。 下面是使用 Python 实现策略模式的一个示例: 示例代码 假设我们有一个简单的购物车系统…...
Js扩展DOM、BOM、AJAX、事件、定时器
BOM 操作 BOM指的是浏览器对象模型:Browser Object Mode,通过操作 window 对象的属性和方法来实现与浏览器的交互。 BOM的构成如下图所示: 其中,window对象是顶级对象,在 window 对象下面有一些重要的属性࿱…...
奥地利学派方法论的三个基础
主观价值论: 一切估价行为皆来自于个人,价格现象只能从主观估价中得到解释。 个人只在边际上做决策,边际价值是递减的。 罗斯巴德的等式:三个单位的某个东西的总效用 > 两个单位的总效用 > 一个单位的总效用,但…...
WPF之Image控件详解
文章目录 1. 概述2. Image控件的基本属性2.1 Source属性2.2 Stretch属性2.3 StretchDirection属性 3. 在XAML中使用Image控件3.1 基本用法3.2 设置拉伸模式3.3 设置图像对齐方式 4. 在代码中操作Image控件4.1 加载本地图像4.2 异步加载图像4.3 从流中加载图像4.4 控制图像的解码…...
如何将 VS Code 与 Linux 系统高效连接:从入门到进阶
引言 无论是开发服务器应用、管理远程主机,还是在本地 Linux 环境中提升开发效率,Visual Studio Code(VS Code) 凭借其强大的扩展能力,成为连接 Linux 系统的利器。本文将详细介绍 三种主流方法,助你无缝对…...
Matlab/Simulink - BLDC直流无刷电机仿真基础教程(五) - animateRotorPosition脚本讲解与使用
Matlab/Simulink - BLDC直流无刷电机仿真基础教程(五) - animateRotorPosition脚本讲解与使用 前言一、animateRotorPosition脚本内容二、脚本功能讲解三、脚本修改与模型配置四、可视化效果展示五、修改后脚本内容文章相关模型文件下载链接参考链接 前言…...
安川机器人常见故障报警及解决办法
机器人权限设置 操作权限设置(如果密码不对,就证明密码被人修改) 编辑模式密码:无(一把钥匙,默认) 管理模式密码:999999999(9个9,二把钥匙) 安全模式密码:555555555(9个5,三把钥匙,权限最高,有的型号机器人,没有此模式,但最高密码为安全模式密码) 示教器…...
【Quest开发】极简版!透视环境下抠出身体并能遮挡身体上的服装
前两天发了一个很复杂的版本,又鼓捣了一下发现完全没有必要。我之前的理解有点偏(不是错误的但用法错了),但是有一些小伙伴收藏了,害怕里面的某些东西对谁有用,所以写了一篇新的,前两步配置环境…...
【Github仓库】Learn-Vim随笔
一、前言 学习vim的过程中发现了很多很好的资源,其中不乏bilibili上up主的精品教程。也在YouTube上看过很多教程。但Learn-Vim这个Github仓库实在让我受益良多。 本笔记便是出于此仓库: 仓库地址 附上个人.vimrc配置文件: syntax on " 开启语法高…...
【2025五一数学建模竞赛C题】社交媒体平台用户分析问题|建模过程+完整代码论文全解全析
你是否在寻找数学建模比赛的突破点?数学建模进阶思路! 作为经验丰富的美赛O奖、国赛国一的数学建模团队,我们将为你带来本次数学建模竞赛的全面解析。这个解决方案包不仅包括完整的代码实现,还有详尽的建模过程和解析,…...
Wireshark抓取SMTP协议报文
文章目录 1. 实验:网络仿真软件使用及网络分析2. SMTP协议2.1 SMTP协议简介2.2 SMTP协议的核心功能2.3 SMTP的相关命令和作用 3. Wireshark抓取报文3.1 抓取SMTP协议报文流程3.1.1 Email邮件服务器背景3.1.2 具体实现流程 3.2 过滤SMTP协议相关报文 4. 协议时序图4.…...
PS学习笔记(一)
课程地址:【B站第一!】央美大佬198小时讲完的PS教程,全程干货无废话!学完秒变大神!还学不会,我不教设计了!!_哔哩哔哩_bilibili 第一章:基础知识 1.PS认识 一、PS应用领…...
部署.NET6.0 Web API项目到Docker
文章目录 介绍创建.NET WebAPI项目项目打包项目部署文件准备部署命令可能的问题与解决 介绍 使用VS2022创建一个.NET6的Web API项目,将其打包,并部署到Linux服务器上的Docker中。 Linux和Docker环境已经备好,本文不再赘述,主要记…...
前端函数防抖(Debounce)完整讲解 - 从原理、应用到完整实现
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Micro麦可乐的博客 🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战 🌺《RabbitMQ》…...
React Redux 与 Zustand
Redux 一、Redux 核心概念 1. 为什么需要 Redux? 解决的问题:在大型 React 应用中,跨组件共享状态、管理复杂数据流。 优势: 单一数据源:全局状态集中存储在 Store 中。 可预测性:通过严格的规则&#…...
Webug4.0靶场通关笔记07- 第9关反射XSS和第10关存储XSS
目录 第09关 反射型XSS 1.打开靶场 2.源码分析 3.渗透实战 第10关 存储型XSS 1.打开靶场 2.源码分析 3.渗透实战 本系列为通过《Webug4.0靶场通关笔记》的渗透集合,本文为反射型和存储型XSS漏洞关卡的渗透部分,通过对XSS关卡源码的代码审计找到漏…...
react学习笔记4——React UI组件库与redux
流行的开源React UI组件库 material-ui(国外) 官网: http://www.material-ui.com/#/github: GitHub - mui/material-ui: Material UI: Comprehensive React component library that implements Googles Material Design. Free forever. ant-design(国内蚂蚁金服) 官网: Ant…...
Java学习手册:Spring 事务管理
一、事务管理的概念 事务是一组操作的集合,这些操作要么全部成功,要么全部失败。事务管理的目的是保证数据的一致性和完整性。在数据库操作中,事务管理尤为重要,例如银行转账、订单支付等场景都需要事务管理来确保数据的正确性。…...
SpringBoot研究生双选系统开发实现
概述 SpringBoot研究生双选信息发布系统,该系统实现了研究生与导师双向选择的全流程管理,采用主流SpringBoot框架开发,是学习企业级教育管理系统开发的优质资源。适合作为计算机专业设计项目或高校信息化建设参考,完整实现…...
springboot中异步接口实现所有方式_20250501
几种异步接口实现demo package org.dromara.controller.app;// 导入必要的依赖库import cn.dev33.satoken.annotation.SaIgnore; import lombok.extern.slf4j.Slf4j; import org.springframework.core.io.Resource; import org.springframework.core.io.UrlResource; import o…...
【Linux网络】I/O多路转接技术 - epoll
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...
机器学习经典算法:用决策树原理优化新能源汽车续航能力
🔥 “用决策树重构新能源车能量大脑!算法推导代码实战全解,续航暴增15%” 决策树算法就像我们生活中做决策的 “流程指南”,通过层层判断得出最终结论。比如你去超市买水果,站在琳琅满目的货架前,就不自觉地…...
深入探讨宾馆一次性牙刷价格,市场价格区间差异大
在我们日常出行、住宿的时候,宾馆的一次性牙刷是常见的、标配的物品。许多人或许都会感到好奇,这些一次性牙刷到底值多少钱。下面就来深入探讨一下宾馆一次性牙刷价格方面的问题。 市场价格区间 宾馆一次性牙刷价格差距大,便宜的一支可能只…...
深入解析 .NET Kestrel:高性能 Web 服务器的架构与最佳实践
Kestrel 是 .NET 中用于处理 HTTP 请求的高性能 Web 服务器。作为 ASP.NET Core 的默认服务器,Kestrel 被设计为在高并发、高吞吐量的环境下表现优异,并且能够支持多种协议和跨平台操作。本文将深入探讨 Kestrel 的架构设计、工作原理、配置方式、性能优…...
ZYNQ 纯PL端逻辑资源程序固化流程
ZYNQ 纯PL端逻辑资源程序固化 ZYNQ的程序固化流程比传统的FPGA固化流程复杂很多,Vivado生成的bit文件无法直接固化在ZYNQ芯片中。因为ZYNQ 非易失性存储器的引脚(如 SD 卡、QSPI Flash)是 ZYNQ PS 部分的专用引脚。这些非易失性存储器由 PS …...
【树莓派Pico FreeRTOS】-FreeRTOS-SMP移植
FreeRTOS-SMP移植 文章目录 FreeRTOS-SMP移植1、Raspberry Pi Pico SDK准备2、下载最新FreeRTOS-Kernel源码3、Raspberry Pi Pico的开发环境搭建4、编译配置5、FreeRTOSConfig.h文件设置6、演示代码RP2040 由 Raspberry Pi 设计,具有双核 Arm Cortex-M0+ 处理器和 264KB 内部 …...
数字智慧方案5961丨智慧能源与运维云平台解决方案(52页PPT)(文末有下载方式)
详细资料请看本解读文章的最后内容。 资料解读:智慧能源与运维云平台解决方案 在当今数字化时代,能源管理与设备运维的智能化、高效化成为企业发展的关键。智慧能源与运维云平台解决方案应运而生,为企业提供了全面且先进的能源管理和运维手段…...
2025东三省C题深圳杯C题数学建模挑战赛数模思路代码文章教学: 分布式能源接入配电网的风险分析
完整内容请看文章最下面的推广群 数据整理与分析 表1:有源配电网62节点系统负荷参数 内容:列出了62个节点的有功负荷(单位:kW)。 特点: 负荷范围:24 kW(节点19)到420 …...