函数指针数组的妙用

Camera mipi通信协议 MIPI(移动行业处理器接口),是的缩写。MIPI移动行业处理器接口)是MIPI联盟发起的为移动应用处理器制定的开放标准。分别定义了一系列的手机内部接口标准,比如摄像头接口CSI、显示接口DSI,其中是由MIPI联盟下Camera工作组指定的接口标准。CSI-2是MIPI CSI第二版,主要由应用层、协议层、物理层组成,最大支持4通道数据传输、单线传输速度高达1Gb/s。 阅读详情

转:函数指针数组的妙用(I)

  (2007-05-01 14:31:11)
  分类: C语言

 笔者在开发某软件过程中遇到这样一个问题,前级模块传给我二进制数据,输入参数为 char* buffer 和 int length,buffer是数据的首地址,length表示这批数据的长度。数据的特点是:长度不定,类型不定,由第一个字节(buffer[0])标识该数据的类型,共有256(2的8次方)种可能性。我的任务是必须对每一种可能出现的数据类型都要作处理,并且我的模块包含若干个函数,在每个函数里面都要作类似处理。若按通常做法,会写出如下代码:  

1 void MyFunction(char* buffer, int length)
2{
3   __int8 nStreamType = buffer[0]
4   switch(nStreamType)
5   {
6     case 0:
7       function1();
8       break;
9     case 1:
10     ......
11    case 255:
12       function255();
13       break;
14    }
15}

 

 

 

 

 

 

 

 

 

 

   如果按照这种方法写下去,那么在我的每一个函数里面,都必须作如此多的判断,写出的代码肯定很长,并且每一次处理,都要作许多次判断之后才能找到正确的处理函数,代码的执行效率也不高。针对上述问题,我想到了用函数指针数组方法解决这个问题。

函数指针的概念,在潭浩强先生的C语言程序设计这本经典的教程中提及过,在大多数情况下我们使用不到,也忽略了它的存在,函数名实际上也是一种指针,指向函数的入口地址,但它以不同于普通的如int*、double*指针,看下面的例子来理解函数指针的概念:

1  int funtion(int x, int y)
2  void main(void)
3  {
4    int(*fun)(int x, int y)
5    int a = 10, b = 20;
6    function( a, b)
7    fun = function;
8    (*fun)(a, b);
9    .......
10 }

 

语句1 定义了一个函数function,其输入为两个整数,返回也为一个整形数(输入参数和返回值可为其它任意数据类型);

 

语句3 定义了一个函数指针,与int* 或double* 定义指针不同的是,函数指针的定义必须同时指出输入参数,表明这是一个函数指针,并且*fun也必须用一对括号起来;

 

语句6 将函数指针赋值为function,前提条件是*fun和function的输入参数和返回值必须保持一到。

 

语句5 直接调用函数functio()。

 

语句7 是调用函数指针,二者等效。

 

当然从上述例子看不出函数指针的优点,目的主要是想引出函数指针数组的概念。我们从上面例子可以得知,既然函数名可以通过函数指针加以保存,那么也一定能定义一个数组保存若干个函数名,这就是函数指针数组。正确使用函数指针数组的前提条件是,这若干个这样,我工作中所面临的问题可以解决如下:

首先定义256个处理函数(及其实现)。

void function0(void);

......

void funtion255(void);

 

其次定义函数指针数组,并给数组赋值。

void(*fun[256])(void);

fun[0] = function0;

.....

fun[255] = function();

最后MyFunction()函数可以修改如下:

1  void MyFunction(char* buffer, int length)
2  {
3    __int8 nSteamType = buffer[0];
4    (*fun[nStreamType])();
5  }

 

只要2行代码,就完成了256条语句要做的事,减少了编写代码时工作量,将nStreamType作为数组下标,从代码执行效率上来说,也比case语句高。假如多个函数中均要作如此处理,函数指针数组更能体现出它的优势。

 

函数指针与typedef

关于C++中函数指针的使用(包含对typedef用法的讨论)

(一)简单的函数指针的应用。

1  //形式1:返回类型 (*函数名)(参数表)
2  char (*pFun)(int);
3  char glFun(int a){ return; }
4  void main()
5  {
6    pFun = glFun;
7    (*pFun)(2);
8  }

 

   第一行定义了一个指针变量pFun。首先我们根据前面提到的;“形式1”认识到它是一个指向某种函数的指针,这种函数参数是一个int型,返回值是char类型。只有一句我们还无法使用这个指针,因为我们还未对它进行赋值。

 

  第二行定义了一个函数glFun()。该函数正好是一个以int为参数返回char的函数。我们要从指针的层次上理解函数--函数的函数名实际上就是一个指针,函数名指向该函数的代码在内存中的首地址。

 

  然后就是可爱的main()函数了,它的第一名您应该看得懂了--它将函数glfun的地址赋值给变量pFun。main()函数的第二句中“*pFun”显然是取pFun所指向的地址的内容,当然也就是取出了函数glFun()的内容,然后给定参数为2。

 (二)使用typedef更直观更方便

1  //形式2:typedef 返回类型(*新类型)(参数)
2  typedef char(*PTRFUN)(int);
3  PTRFUN pFun;
4  char glFun(int a){ return;}
5  void main()
6  {
7    pFun = glFun;
8   (*pFun)(2);
9  }

 

 typedef的功能是定义新的类型。

  第一行就是定义了一种PTRFUN的类型,并定义这种类型为指向某种函数的指针,这种函数以以一个int为参数并返回char类型。后面就可以像使用int,char一样使用PTRFUN了。

  第二行的代码使使用这个新类型定义了变量pFun,此时就可以像使用形式1一样使用这个变量了。

 

(三)在C++类中使用函数指针:

1   //形式3:typedef 返回类型(类名::*新类型)(参数表)
2   class CA
3   {
4   public:
5     char lcFun(int a){ return; }
6   };
7   CA ca;
8   typedef char(CA::*PTRFUN)(int);
9   PTRFUN pFun;
10  void main()
11  {
11    pFun = CA::lcFun;
13    ca.(*pFun)(2);
14  }

 

在这里,指针的定义与使用都加上了“类限制”或“对象”,用来指明指针指向的函数是哪个类的,这里的类对象也可以是使用new得到。比如:

1  CA* pca = new CA;
2  pca->(*pFun)(2);
3  delete pca;

 

而且这个类对象指针可以是类内部成员变量,你甚至可以使用this指针。比如:

1  void CA::lcFun2()
2  {
3    (this->*m_pFun)(2);
4  }

 

 一句话,使用类成员函数指针必须有“->*”或“.*”的调用。 

大模型性能压测全指南:从指标到实战 本文系统阐述大模型(LLM/多模态)私有化部署性能压测方案,涵盖核心指标(TTFT、TPOT、吞吐、并发、资源占用、错误率)、四类典型压测场景及工具选型(Locust、vLLM benchmark等)。强调环境隔离、参数固定与长尾延迟分析,提出瓶颈定位思路与标准化报告模板,结合伪代码示例实现流式接口精准打点,确保测试结果真实可信,助力优化模型服务稳定性与性能。 阅读详情

相关推荐

Gephi实战指南——从数据导入到可视化输出

本文详细介绍了Gephi数据可视化工具的使用方法,从数据导入到可视化输出的全流程实战指南。涵盖Gephi三大工作区功能、数据导入技巧、图形编辑进阶操作以及专业级可视化输出方案,帮助用户高效完成社交网络分析等复杂任务。

weixin_28731223的博客 481

C++学习笔记之数组、函数、指针

数组、函数、指针

weixin_46819249的博客 1002

LEAP模型—低排放分析平台

LEAP 正在迅速成为进行综合资源规划、温室气体 (GHG) 缓解评估和低排放发展战略 (LEDS) 的国家的事实标准,尤其是在发展中国家,许多国家也选择使用 LEAP 作为其承诺的一部分向联合国气候变化框架公约(UNFCCC)报告。至少有 32 个国家使用 LEAP 来创建能源和排放情景,这些情景是其国家自主气候变化贡献计划 (INDC) 的基础:具有历史意义的巴黎气候协议的基础旨在表明各国开始经济脱碳的意图和投资于气候适应力。

weixin_54697010的博客 3282

VB真是想不到系列之二:VB《葵花宝典》--指针技术

《VB真是想不到系列》    每次看大师的东西到了精彩之处,我就会拍案叫绝:"哇噻,真是想不到!"。在经过很多次这种感慨之后,我发现只要我们动了脑筋,我们自己也能有让别人想不到的东西。于是想到要把这些想不到的东拿出来和大家一起分享,希望抛砖引玉,能引出更多让人想不到的东西。                      VB真是想不到系列之二:VB《葵花宝典》--指针技术关键字:VB、指针、动态内存分

AdamBear的专栏 7956

UI-TARS桌面版模型部署

在 UI-TARS 中配置 VLM(视觉语言模型)模型,无论是选择云端(Hugging Face)还是本地(vLLM)部署,都需要经过一系列步骤,下面为你详细展开介绍。

二琳爱吃肉的博客 4540

从.har文件到Postman集合:一键转换的完整教程(附避坑指南)

本文详细介绍了如何将.har文件高效转换为Postman集合的完整教程,涵盖基础操作到高级技巧,包括认证信息处理、环境变量提取等痛点问题的解决方案。通过抓包工具记录的.har文件,开发者可以快速生成Postman集合,提升API调试与测试效率,特别适合前后端分离开发模式下的团队协作。

weixin_26795617的博客 384

数组指针,指针数组的区别理解

在一维数组中,int*p=arr 上图为一维数组,箭头指向该数组首元素的地址,数组表示的类型如下表所示: 一维数组 类型 arr(指向首元素的指针) int* arr+1(指向首元素的指针向右移动一个格子) int* arr[0](0号下标对应的数组中的值) int arr[0]+1(给0号下标对应的值加1) int 在二维数组中,int brr[3][4] ...

qx04070711的博客 331

扩增子分析|溯源分析在R中的复现:跟着Nature系列文章利用FEAST溯源分析包追溯微生物群落的起源

溯源分析由Liat Shenhav等人在2019年发表在Nature Methods杂志,他们开创的一种分析微生物群落组成结构的方法,通过量化不同微生物样本(来源)在目标微生物群落(汇)中的比例或分数识别微生物群落的潜在来源。该方法自发表以来受到微生物学界广泛关注,该论文截止2024年10月9日已经被引289次,是领域内高被引论文,该方法已经成为Nature,cell系列文章高度关注的方法。

weixin_46814750的博客 3437

指针函数和函数指针

概述 指针函数和函数指针是C语言里两个比较绕的概念。但是不仅面试题爱考,实际应用中也比较广泛。很多人因为搞不清这两个概念,干脆就避而远之,我刚接触C语言的时候对这两个概念也比较模糊,特别是当指针函数、函数指针、函数指针变量、函数指针数组放在一块的时候,能把强迫症的人活活逼疯。 其实如果理解了这些概念的本质,是不需要死记硬背的,理解起来也比较容易。 指针函数 指针函数: 顾名思义,它的本质是一个函数...

禹鼎侯的博客 13万+

XDMA流传输模式

XDMA 流传输模式(Streaming DMA)​ 是 Xilinx FPGA 通过 PCIe 与主机进行 ​实时流式数据传输 的核心机制,

浩瀚之水的专栏 3435

maya导入导出bvh 自动 脚本

maya打开bvh脚本

jacke121的专栏 1551

通过指针引用数组(包含多种例子,清晰易懂)

大纲浏览 ①数组元素的指针 ②在引用数组元素时指针的运算 ③通过指针引用数组元素 ④用数组名作函数参数 ⑤通过指针引用多维数组 ①数组元素的指针 一个变量有地址,一个数组包含若干元素,每个数组元素都有相应的地址 指针变量可以指向数组元素(把某一元素的地址放到一个指针变量中) 所谓数组元素的指针就是数组元素的地址 注意: p=&a[0]等价于p=a(p的值是数组a首元素a[...

hey,欢迎浏览我的博客,希望能给你提供帮助。 8603

RK356x U-Boot研究所(命令篇)3.7 pci与nvme命令的用法

RK356x U-Boot研究所(命令篇)3.7 pci与nvme命令的用法

Systemcall名屋 2084

c++中函数指针数组妙用

笔者在开发某软件过程中遇到这样一个问题,前级模块传给我二进制数据,输入参数为 char* buffer和 int length,buffer是数据的首地址,length表示这批数据的长度。数据的特点是:长度不定,类型不定,由第一个字节(buffer[0])标识该数据的类型,共有256(28 )种可能性。我的任务是必须对每一种可能出现的数据类型都要作处理,并且我的模块包含若干个函数,在每个函数里面都...

chen801090的博客 615

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C | 函数指针数组妙用

铁汁们都知道,指针对C/C++来说就是灵魂,而同类型指针又能封装到数组中。本文就来讲讲函数指针数组的应用场景优化之后代码整洁直观了许多,主要思想就是统一打包。相信函数指针数组还有很多应用场景,快去试试叭~

CGod的博客 1162

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

函数指针及函数指针数组的妙用

贺芸在线交流平台 388

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

C++中函数指针数组的妙用

 C++中函数指针数组的妙用2001-03-27· 陈德林·yesky    笔者在开发某软件过程中遇到这样一个问题,前级模块传给我二进制数据,输入参数为 char* buffer和 int length,buffer是数据的首地址,length表示这批数据的长度。数据的特点是:长度不定,类型不定,由第一个字节(buffer[0])标识该数据的类型,共有256(28 )种可能性

新州隐士专栏 659

【转】函数指针数组的妙用

笔者在开发某软件过程中遇到这样一个问题,前级模块传给我二进制数据,输入参数为 char* buffer和 int length,buffer是数据的首地址,length表示这批数据的长度。数据的特点是:长度不定,类型不定,由第一个字节(buffer[0])标识该数据的类型,共有256(28 )种可能性。我的任务是必须对每一种可能出现的数据类型都要作处理,并且我的模块包含若干个函数,在每个...

andy76123的博客 108
上一篇: 函数指针及函数指针数组的妙用
下一篇: 函数指针数组的妙用
linuxheik
博客等级 码龄15年 865粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值