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

【时时三省】(C语言基础)用指向函数的指针作函数参数

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省

指向函数的指针变量的一个重要用途是把函数的入口地址作为参数传递到其他函数。指向函数的指针可以作为函数参数,把函数的入口地址传递给形参,这样就能够在被调用的函数中使用实参函数。它的原理可以简述如下:有一个函数(假设函数名为fun),它有两个形参( x1和x2 ),定义x1和x2为指向函数的指针变量。在调用函数fun时,实参为两个函数名f1和f2,给形参传递的是函数f1和f2的入口地址。这样在函数fun中就可以调用f1和f2函数了。

在fun函数中声明形参x1和x2为指向函数的指针变量, xl指向的函数有一个整型形参,x2指向的函数有两个整型形参。i和j是调用fl和f2函数时所要求的实参。函数fun的形参xl和x2(指针变量)在函数fun未被调用时并不占内存单元,也不指向任何函数。在主函数调用fun函数时,把实参函数f1和f2的入口地址传给形参指针变量x1和x2,使x1和x2指向函数f1和f2。这时,在函数fun中,用* x1和* x2就可以调用函图fl和f2。( * xl ) ( i )就相当于fl ( i ) , ( * x2 ) ( i , i )就相当于f2 ( i , j )。

有人可能会问,既然在fun函数中要调用f1和f2函数,为什么不直接调用f1和f2而要用函数指针变量呢?何必绕这样一个圈子呢?的确,如果只是用到fl和f2函数,完全可以在fun函数中直接调用fl和f2,而不必设指针变量x1和x2。但是,如果在每次调用fun函数时,要调用的函数不是固定的,这次调用fl和f2,而下次要调用f3和f4,第3次要调用的是f5和f6。这时,用指针变量就比较方便了。只要在每次调用fun函数时给出不同的函数名作为实参即可,fun函数不必做任何修改。这种方法是符合结构化程序设计方法原则下面通过一个简单的例子来说明这种方法的应用。

例题1:

两个整数a和b,由用户输入1,2或3。如输入1,程序就给出a和b中的大者,输入2,就给出a和b中的小者,输入3,则求a与b之和。

编写程序:

运行结果:

选择1:

选择2:

选择3:

在定义fun函数时,在函数首部用“int ( * p ) ( int,int )”声明形参p是指向函数的指针,该函数是整型函数,有两个整型形参。max,min和add是已定义的3个函数,分别用来实现求大数、求小数和求和的功能。

当输入1时( n = 1 ),调用fun函数,除了将a和b作为实参,将两个整数传给fun函数的形参x和y外,还将函数名max作为实参将其入口地址传送给fun函数中的形参p ( p是指向函数的指针变量)。这时,fun函数中的( *p ) ( x,y )相当于max ( x , y ),调用max ( x,y )就输出a和b中的大者。

若输入2 ( n = 2 ),调用fun函数时,以函数名min作实参,此时fun函数的形参ρ指向函数min,在fun函数中的函数调用( *p ) ( x,y )相当于min ( x,y )。调用min ( x,y )就输出a和b中的小者。同理,若n = 3,调用fun函数时,以函数名add作实参,fun函数中的( *p ) ( x,y )相当于add ( x,y ),调用add ( x,y ),就输出a和b之和。

从本例可以清楚地看到,不论调用max,min或add,函数fun都没有改变,只是改变实参函数名而已。在fun函数中输出result,由于在不同的情况下调用了不同的函数,因此result的值是不同的。这就增加了函数使用的灵活性。可以编写一个通用的函数来实现各种专用的功能。需要注意的是,对作为实参的函数(如max,min,add),应在主调函数中用函数原型作函数声明。

 

http://www.dtcms.com/a/299718.html

相关文章:

  • 网络:应用层
  • 【硬件-笔试面试题】硬件/电子工程师,笔试面试题-30,(知识点:传输线特性阻抗,影响因素)
  • 【web应用】基于Vue3和Spring Boot的课程管理前后端数据交互过程
  • 1、虚拟机安装
  • InfluxDB Flux 查询协议实战应用(二)
  • Linux726 raid0,raid1,raid5;raid 创建、保存、停止、删除
  • Python 程序设计讲义(22):循环结构——for 循环
  • 使用FRP搭建内网穿透工具,自己公网服务器独享内外网端口转发
  • C++ APM异步编程模式剖析
  • 2025微前端架构研究与实践方案
  • 【6G新技术探索】AG-UI(Agent User Interaction Protocol) 协议介绍
  • Flutter开发实战之动画与交互设计
  • Java 注解(Annotation)详解:从基础到实战,彻底掌握元数据驱动开发
  • 详细介绍MySQL的索引类型
  • mybatis-plus从入门到入土(三):持久层接口之IService
  • 【MySQL】MySQL 缓存方案
  • 【Redis】Linux 配置Redis
  • 基于华为ENSP的OSPFLSA深入浅出-0
  • 从三维Coulomb势到二维对数势的下降法推导
  • Netty中DefaultChannelPipeline源码解读
  • LangChain vs LangGraph:从困惑到清晰的认知之路(扫盲篇)
  • (一)使用 LangChain 从零开始构建 RAG 系统|RAG From Scratch
  • RM-R1: Reward Modeling as Reasoning
  • Java java.util.Scanner 使用教程
  • 工作流的研究方向
  • (Python)文件储存的认识,文件路径(文件储存基础教程)(Windows系统文件路径)(基础教程)
  • 嵌入式分享#27:原来GT911有两个I2C地址(全志T527)
  • 数据湖产品全解析:2025 年主流解决方案选型指南
  • 酒店智能门锁SDK新V门锁系统接口函数[2025版]Delphi 7.0——东方仙盟硬件接口库
  • AI三巨头:机器学习、深度学习与人工智能解析