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

指针——函数指针数组

(一)前文回顾

1、前篇代码分析

void(*signal(int , void(*)(int)))(int) ;

那么这串代码究竟是什么呢?

别慌,让我们来一步一步拆解,首先我们通过之前的学习,已经明白了什么是函数指针(如果有不太懂得,请看前一篇文章)

仔细观察这串代码,不难发现出现了 signal 此时肯定会有人想是不是有什么特殊的含义。。。

很明显,signal就是简简单单的一个函数名,不行,来我们轻轻的把这串代码“大卸八块”。

(1)去掉最外层的 void()(int) 剩余 *signal(int , void(*)(int)) ;  现在signal只有两种可能。【1,就是指针      2,是函数名】

         我们之前的学习中已经知道当 * 和()同时存在的时候,()首先于变量名结合,所以此处的  signal(int , void(*)(int)) 首先是一部分,也就是个函数。

(2)再来看 signal(int , void(*)(int)) 的()内的部分,我们发现有个 int,这说明函数内有个参数是 int 类型,那么剩余的参数 void(*)(int) 是什么类型呢?

         学过函数指针的朋友不难看出,这就是一个函数指针类型的参数

(3)再想想,* 是什么呢 ?此时发现不好解释啊,但是你把刚开始去掉的外层结构加上再看就会一目了然!

         void(*        )(int)   //这也是个函数指针类型,再结合中间部分是个函数,我们就能明白整个代码 void(*signal(int , void(*)(int)))(int) ; 的意思是  函数指针类型的函数

(二)函数指针数组

1、基本知识

(1)本质:

函数指针数组,顾名思义就是存放函数指针的一个数组!!!

(2)示例

int add(int x , int y)  //定义一个函数实现两个整数的相加

{

      return x+y;
}

int sub(int x , int y)  //定义一个函数实现两个整数的相减

{

      return x+y;
}

int main()

{
      int(*pf)( int ,int ) = add ; //定义一个函数指针指向 add 函数

      int(*pf1)( int ,int ) = sub ;  //定义一个函数指针指向 sub 函数

      int( *parr[2] )( int ,int ) = {pf,pf1 };  //此时的parr就是一个数组,类型为函数指针,存放了两个函数指针

}

根据上述代码,我们就能知道函数指针数组究竟是什么样的了,需要注意的是 函数指针数组和普通数组大致相同,存放的元素类型要相同,所以存放的函数指针的类型也要相同!!

2、练习——计算器——避免使用switch()

(1)基本思路

1. 首先简单的计算器我们需要 四个函数 来分别实现 加减乘除 四个功能 ;

2.需要一个菜单来提醒用户;

3.在主函数中需要循环,并且由于不使用 switch(),所以应用本节学习,使用函数指针数组

(2)代码如下:

#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 menu()  //菜单
{printf("***0.加法*******\n");printf("***1.减法*******\n");printf("***2.乘法*******\n");printf("***3.除法*******\n");printf("***4.退出*******\n");
}
int main()
{int(*pf[5])(int, int) = { Add, Sub ,Mul,Div,NULL };//定义一个函数指针数组,数组第1,2//3,4个元素分别对应四个函数,可以使用下标来取出,最后一个元素是个空指针,来退出程序int a = 0;  //定义一个局部变量来让用户选择具体算法int b, c = 0;do {//使用do while()循环可以不判断先执行一次menu();printf("请选择\n");scanf_s("%d", &a);if (a >= 0 && a <= 3)//下标在0~3即对应四个函数{printf("请输入两个数\n");scanf_s("%d %d", &b, &c);int ret = pf[a](b, c); //调用printf("%d\n", ret);}else if (a == 4)//下标为4就对应空指针{printf("退出\n");break;}else{printf("选择错误\n");//选择其余显示错误break;}} while (a);return 0;
}

执行如下: 

相关文章:

指针——函数指针数组

&#xff08;一&#xff09;前文回顾 1、前篇代码分析 void(*signal(int , void(*)(int)))(int) ; 那么这串代码究竟是什么呢&#xff1f; 别慌&#xff0c;让我们来一步一步拆解&#xff0c;首先我们通过之前的学习&#xff0c;已经明白了什么是函数指针&#xff08;如果有…...

MySQL中的增查操作:探索数据的奥秘,开启数据之门

本节&#xff0c;我们继续深入了解MySQL&#xff0c;本章所讲的基础操作&#xff0c;针对的是表的增删查改&#xff01; 一、Create 新增 1.1、语法 INSERT [INTO] table_name[(column [, column] ...)] VALUES(value_list) [, (value_list)] ... value_list: value, [, va…...

oracle_查询建表语句

查询建表语句 SELECTdbms_metadata.get_ddl ( TABLE, <table_name> ) FROMdualdbms_metadata.get_ddl&#xff1a;是Oracle提供的一个函数&#xff0c;用于获取数据库对象的DDL语句&#xff0c;它允许你查看或导出数据库对象的创建脚本‘TABLE’&#xff1a; 是这个函数…...

004-按照指定功能模块名称分组

按照指定功能模块名称分组 一、说明1.现在有一个需求&#xff1a;2.具体做法 二、代码案例三、效果展示 一、说明 1.现在有一个需求&#xff1a; 需要把一个功能模块的几个功能点放在同一个文档目录下&#xff0c;这几个功能点分布在不同的 Controller 2.具体做法 需要把他…...

ChatGPT写作助手:论文写作必备提示词一览

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 随着人工智能技术的发展&#xff0c;ChatGPT在学术写作领域的应用越来越广泛。它不仅能够帮助撰写论文&#xff0c;还可以通过不同的提示词完成构思、文献综述、数据分析、润色等任务&a…...

大数据开发电脑千元配置清单

大数据开发电脑配置清单 电脑型号HUANANZHI 台式电脑操作系统Windows 11 专业版 64位&#xff08;Version 23H2 / DirectX 12&#xff09;处理器英特尔 Xeon(至强) E5-2673 v3 2.40GHz主板HUANANZHI X99-P4T&#xff08;P55 芯片组&#xff09;显卡NVIDIA GeForce GT 610 ( 2…...

VP9官方手册-帧内预测

8.5.1 intra prediction process...

windows 自定义scheme协议。

浏览器打开自定义scheme参考上一篇&#xff1a;Chromium 自定义scheme协议启动过程分析c 1、注册表里面按照如下格式填写自定义scheme协议导入&#xff1a; Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\jdtest] "URL:jdtest Protocol" "URL Proto…...

什么是SQLite?

一、什么是SQLite? SQLite是一个进程内的软件库&#xff0c;实现了自给自足的、无服务器的、零配置的、事务性的SQL数据库引擎。它是一个零配置的数据库&#xff0c;这意味着与其他数据库不一样&#xff0c;您不需要在系统中配置。 就像其它数据库&#xff0c;SQLite引擎不是…...

域1:安全与风险管理 第2章-人员安全与风险管理

第二章的内容确实较为丰富&#xff0c;需要细心且耐心地逐步消化和理解。不妨放慢阅读速度&#xff0c;对每个要点都进行深入思考&#xff0c;确保自己真正掌握了其核心意义。这样&#xff0c;虽然可能花费更多时间&#xff0c;但能够更扎实地掌握第二章的知识&#xff0c;为后…...

php中的错误和异常捕获

目录 一&#xff1a; 异常&#xff08;Exceptions&#xff09; 二&#xff1a; 错误&#xff08;Errors&#xff09; 三&#xff1a;实际项目的异常和错误处理 在PHP中&#xff0c;异常&#xff08;Exceptions&#xff09;和错误&#xff08;Errors&#xff09;是两个不同的…...

nextjs项目中,使用postgres的完整案例

目的 通过此案例&#xff0c;可以简单快速的过一下数据库的操作&#xff0c;熟悉app-router这种模式下&#xff0c;client component和server component的两种组件中基本的接口使用。 技术栈 nextjs14.2.* app-routervercel/postgres0.10.*typescript5 重要事情说三遍1 ap…...

tsconfig.json 内容解读

tsconfig.json 文件是 TypeScript 项目的主要配置文件&#xff0c;用于指定编译选项和项目设置。通过这个文件&#xff0c;你可以控制编译器的行为&#xff0c;例如输出文件的路径、模块解析方式、严格类型检查等。 以下是一些常见的 tsconfig.json 属性及其详细解释&#xff…...

KClass-关于kotlin中的反射

override val responseType: KClass<SetOperationModeResponse> SetOperationModeResponse::class,这段代码的含义&#xff1a; responseType 是一个只读属性&#xff08;val&#xff09;&#xff0c;它的类型是 KClass<SetOperationModeResponse>。KClass<T&…...

Java集合剖析2】Java集合底层常用数据结构

一、数据结构与集合 接下来就要学习集合具体的实现类了&#xff0c;集合的实现类底层可能用1种或多种数据结构来存储数据。所以在学习集合的实现类前&#xff0c;我们有必要了解一下一些常见的数据结构&#xff0c;这样我们在后面查看集合实现类的底层源码时&#xff0c;才不会…...

java 第10天 String创建以及各类常用方法

一.String创建的两种形式 1.通过new的当时 String strnew String(); 2.不new的方式 String s1""; 二.new 和不new的方式的区别是什么 不new创建的字符串首先是拿着值去常量池中查找&#xff0c;是否有该内容&#xff0c;有就用常量池该字符串的地址&#xff0…...

VS 解决方案里面.vs文件夹

VS解决方案中的.vs文件夹主要用于存储当前用户在解决方案中的工作配置。 这些配置包括多个方面&#xff1a; 窗口布局和选项卡状态&#xff1a;.vs文件夹记录了VS关闭前最后的窗口布局以及最后打开的选项卡。这样&#xff0c;当用户重新打开解决方案时&#xff0c;可以继续之前…...

初试PostgreSQL数据库

文章目录 一、PostgreSQL数据库概述1.1 PostgreSQL的历史1.2 PostgreSQL安装1.3 安装PostgreSQL二、PostgreSQL起步2.1 连接数据库2.1.1 SQL Shell2.1.2 执行SQL语句2.2 pgAdmin 42.2.1 打开pgAdmin 42.2.2 查找数据库2.2.3 打开查询工具2.2.4 执行SQL语句三、实战小结文章目录…...

springboot3导出数据库数据到excel

一、导入依赖 <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.3.0</version></dependency><d…...

十四、行为型(观察者模式)

观察者模式&#xff08;Observer Pattern&#xff09; 概念 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了对象间的一对多依赖关系&#xff0c;当被观察的对象&#xff08;主题&#xff09;状态发生改变时&#xff0c;所有依赖…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题&#xff0c; 因为搜索范围是有界的&#xff0c;上界最大木板长度补充的全部木料长度&#xff0c;下界最小木板长度&#xff1b; 即left0,right10^6; 我们可以设置一个候选值x(mid)&#xff0c;将木板的长度全部都补充到x&#xff0c;如果成功…...

tauri项目,如何在rust端读取电脑环境变量

如果想在前端通过调用来获取环境变量的值&#xff0c;可以通过标准的依赖&#xff1a; std::env::var(name).ok() 想在前端通过调用来获取&#xff0c;可以写一个command函数&#xff1a; #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...

微服务通信安全:深入解析mTLS的原理与实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言&#xff1a;微服务时代的通信安全挑战 随着云原生和微服务架构的普及&#xff0c;服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...

车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...