当前位置: 首页 > 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;所有依赖…...

自举电容在Buck电路中的关键作用-3个核心要点解析

1. 自举电容在Buck电路中的核心作用 我第一次接触Buck电路时&#xff0c;看到SW引脚旁边那个小小的电容&#xff0c;心里直犯嘀咕&#xff1a;这么个小东西能有多大作用&#xff1f;后来在实际项目中踩过几次坑才明白&#xff0c;这颗看似不起眼的自举电容(Cboot)&#xff0c;其…...

Multisim 14.0实战:用74LS160和74LS161搭建61进制计数器(附完整电路图)

Multisim 14.0实战&#xff1a;用74LS160和74LS161搭建61进制计数器 在电子工程领域&#xff0c;计数器电路设计是数字逻辑课程的核心实践内容之一。对于初学者而言&#xff0c;理解计数器的工作原理并通过仿真软件实现特定进制计数功能&#xff0c;不仅能巩固理论知识&#x…...

RimWorld模组管理终极指南:从混乱到秩序的专业解决方案

RimWorld模组管理终极指南&#xff1a;从混乱到秩序的专业解决方案 【免费下载链接】RimSort RimSort is an open source mod manager for the video game RimWorld. There is support for Linux, Mac, and Windows, built from the ground up to be a reliable, community-man…...

CLAUDE.md 写到 500 行还管不住 AI?Skills 分层食用指南 + AGENTS.md 跨工具吃遍天下

一个资深 Claude Code 用户的心路历程&#xff1a;从写 CLAUDE.md 写到手抽筋&#xff0c;到三层 Skills 按需拼装&#xff0c;再到一份规则走通 Codex、Cursor、Aider 全家桶。这篇把坑都给你踩平。 写在前面 场景还原一下&#xff1a; 你在项目 A 里精心写了一份 CLAUDE.md…...

Git新手必看:5个最常用命令搞定代码拉取与分支管理(附Gerrit实战)

Git新手必看&#xff1a;5个最常用命令搞定代码拉取与分支管理&#xff08;附Gerrit实战&#xff09; 第一次接触Git时&#xff0c;面对满屏的命令行参数和陌生的概念&#xff0c;很多开发者都会感到手足无措。记得我刚入职时&#xff0c;为了提交一行代码修改&#xff0c;整整…...

使用Dify快速搭建SmolVLA应用:可视化工作流与Agent编排

使用Dify快速搭建SmolVLA应用&#xff1a;可视化工作流与Agent编排 你是不是也遇到过这样的场景&#xff1a;手里有一个很酷的多模态大模型&#xff0c;比如能看懂图片又能聊天的SmolVLA&#xff0c;但不知道怎么把它变成一个能实际用起来的应用&#xff1f;自己写代码吧&…...

NBIO与标准net/http对比:10倍性能提升的秘密

NBIO与标准net/http对比&#xff1a;10倍性能提升的秘密 【免费下载链接】nbio Pure Go 1000k connections solution, support tls/http1.x/websocket and basically compatible with net/http, with high-performance and low memory cost, non-blocking, event-driven, easy-…...

保姆级教程:在CentOS 7上配置sysstat实现24小时性能监控(含报警设置)

CentOS 7系统性能监控全攻略&#xff1a;从sysstat配置到智能报警实战 对于Linux系统管理员而言&#xff0c;持续监控服务器性能指标就像医生定期检查病人生命体征一样重要。sysstat工具包中的sar命令提供了这种"全天候体检"能力&#xff0c;但很多初学者往往止步于基…...

OpenClaw自动化测试:千问3.5-35B-A3B-FP8多模态任务可靠性验证方法

OpenClaw自动化测试&#xff1a;千问3.5-35B-A3B-FP8多模态任务可靠性验证方法 1. 为什么需要系统性测试多模态模型 上周我在调试一个自动整理图片的OpenClaw工作流时&#xff0c;遇到了诡异的现象——AI助手把会议白板照片里的流程图误识别成了"披萨制作步骤"。这…...

YOLOv11与PP-DocLayoutV3对比:目标检测与文档版面分析的技术异同

YOLOv11与PP-DocLayoutV3对比&#xff1a;目标检测与文档版面分析的技术异同 最近在和朋友聊起计算机视觉项目时&#xff0c;发现一个挺有意思的现象。有人拿着一个号称“地表最强”的通用目标检测模型&#xff0c;信心满满地想去处理一份复杂的扫描版PDF&#xff0c;结果却碰…...