C语言的函数指针

介绍+案例

什么是函数指针?

函数指针 是指向函数的指针变量,它可以用来间接调用函数。在 C/C++ 中,函数指针允许程序在运行时选择调用不同的函数,这使得代码更加灵活和动态。函数指针广泛应用于回调函数、事件处理、动态选择算法等场景。

函数指针的声明

函数指针的声明语法如下:

return_type (*pointer_name)(parameter_type1, parameter_type2, ...);
  • return_type 是函数返回值的类型。
  • pointer_name 是指针变量的名字。
  • parameter_type1, parameter_type2, ... 是函数的参数类型。
  • * 表示这是一个指针,指向一个函数。

例子:简单的函数指针

以下是一个简单的函数指针例子,演示了如何声明和使用函数指针:

1. 使用函数指针调用函数
#include <iostream>
using namespace std;// 定义两个简单的函数
int add(int a, int b) {return a + b;
}int subtract(int a, int b) {return a - b;
}int main() {// 定义一个函数指针,指向接受两个int参数并返回int的函数int (*operation)(int, int);// 将函数指针指向add函数operation = add;cout << "10 + 5 = " << operation(10, 5) << endl; // 调用add函数// 将函数指针指向subtract函数operation = subtract;cout << "10 - 5 = " << operation(10, 5) << endl; // 调用subtract函数return 0;
}

输出:

10 + 5 = 15
10 - 5 = 5
解释:
  1. 我们定义了两个函数 add 和 subtract,它们都有相同的函数签名:int(int, int)
  2. 在 main 函数中,我们声明了一个函数指针 operation,它指向一个接受两个 int 参数并返回 int 的函数。
  3. 我们先将 operation 指向 add 函数,然后调用 operation(10, 5),实际上就是调用了 add(10, 5)
  4. 接着,我们将 operation 指向 subtract 函数,再次调用 operation(10, 5),这时实际上是调用了 subtract(10, 5)

例子:使用函数指针作为参数

函数指针常用来实现回调函数,允许你将一个函数作为参数传递给另一个函数。

#include <iostream>
using namespace std;// 一个简单的函数,接受一个整数并打印
void printNumber(int n) {cout << "Number: " << n << endl;
}// 接受一个函数指针作为参数,并调用它
void callFunction(void (*func)(int), int value) {func(value);  // 调用函数指针所指向的函数
}int main() {// 将printNumber作为回调函数传递callFunction(printNumber, 42);return 0;
}

输出:

Number: 42
解释:
  1. callFunction 函数接受一个函数指针和一个整数作为参数。
  2. 在 main 函数中,我们将 printNumber 函数的地址作为参数传递给 callFunction
  3. callFunction 调用传递给它的函数指针,并输出结果。

例子:函数指针数组

有时你可能希望有一个函数指针数组,来存储多个函数的指针,从而可以根据索引选择不同的函数。

#include <iostream>
using namespace std;// 定义多个简单的函数
int add(int a, int b) {return a + b;
}int subtract(int a, int b) {return a - b;
}int multiply(int a, int b) {return a * b;
}int divide(int a, int b) {return a / b;
}int main() {// 定义一个函数指针数组,指向接受两个int参数并返回int的函数int (*operations[])(int, int) = { add, subtract, multiply, divide };int a = 10, b = 5;// 通过数组索引调用不同的函数cout << "Addition: " << operations[0](a, b) << endl;cout << "Subtraction: " << operations[1](a, b) << endl;cout << "Multiplication: " << operations[2](a, b) << endl;cout << "Division: " << operations[3](a, b) << endl;return 0;
}

输出:

Addition: 15
Subtraction: 5
Multiplication: 50
Division: 2
解释:
  1. 我们定义了一个包含多个函数指针的数组 operations,每个元素都指向一个接受两个 int 参数并返回 int 的函数。
  2. 通过索引,我们可以调用不同的函数,如 operations[0](a, b) 调用的是 add(a, b)operations[1](a, b) 调用的是 subtract(a, b)

使用函数指针的优点

  • 灵活性和可扩展性:使用函数指针,可以在运行时选择调用哪个函数,这对于事件驱动程序、回调机制等非常重要。
  • 回调机制:函数指针常用于回调函数(如 C 标准库的 qsort 或操作系统的事件处理)。
  • 动态行为:通过函数指针,可以实现更加灵活的代码结构,如插件系统、策略模式等。

总结

函数指针是 C/C++ 中强大的工具,可以使程序更加灵活和动态。通过函数指针,我们可以间接调用函数、实现回调机制、甚至动态选择函数等。理解函数指针的概念及其用法是掌握 C/C++ 编程的一个重要步骤。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/64780.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Powershell学习笔记

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…

《Java源力物语》-2.异常训练场

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” \quad 在java.lang古域的一处偏僻角落&#xff0c;矗立着一座古老的训练场。青灰色的围墙上布满了密密麻麻的源力符文&#xff0c;这些符文闪烁着…

一起学Git【第二节:创建版本库】

创建库 这个库相当于一个目录&#xff0c;目录中的文件都被Git管理&#xff0c;会记录每个文件的修改删除和添加工作&#xff0c;便于之后随时跟踪历史记录还原到之前的某一版本。如何创建库呢&#xff1f;有两种方式&#xff0c;本地创建库和云端克隆一个库。 1.本地创建库 …

HarmonyOS NEXT 技术实践-基于基础视觉服务的多目标识别

在智能手机、平板和其他智能设备日益智能化的今天&#xff0c;视觉识别技术成为提升用户体验和智能交互的重要手段。HarmonyOS NEXT通过基础视觉服务&#xff08;HMS Core Vision&#xff09;提供了一套强大的视觉识别功能&#xff0c;其中多目标识别作为其关键技术之一&#x…

nginx-静态资源部署

目录 静态资源概述 静态资源配置指令 listen指令 server_name指令 精确匹配 ​编辑 ​编辑 使用通配符匹配 使用正则表达式匹配 匹配执行顺序 default_server属性 location指令 root指令 alias指令 root与alisa指令的区别 index指令 error_page指令 直接使用 …

时空信息平台架构搭建:基于netty封装TCP通讯模块(IdleStateHandler网络连接监测,处理假死)

文章目录 引言I 异步TCP连接操作II 心跳机制:空闲检测(读空闲和写空闲)基于Netty的IdleStateHandler类实现心跳机制(网络连接监测)常规的处理假死健壮性的处理假死方案获取心跳指令引言 基于netty实现TCP客户端:封装断线重连、连接保持 https://blog.csdn.net/z92911896…

Linux之RPM和YUM命令

一、RPM命令 1、介绍 RPM(RedHat Package Manager).,RedHat软件包管理工具&#xff0c;类似windows里面的setup,exe是Liux这系列操作系统里而的打包安装工具。 RPMI包的名称格式&#xff1a; Apache-1.3.23-11.i386.rpm “apache’” 软件名称“1.3.23-11” 软件的版本号&am…

aosp15 - Activity生命周期切换

本文探查的是&#xff0c;从App冷启动后到MainActivity生命周期切换的系统实现。 调试步骤 在com.android.server.wm.RootWindowContainer#attachApplication 方法下断点&#xff0c;为了attach目标进程在com.android.server.wm.ActivityTaskSupervisor#realStartActivityLock…

【漫话机器学习系列】017.大O算法(Big-O Notation)

大 O 表示法&#xff08;Big-O Notation&#xff09; 大 O 表示法是一种用于描述算法复杂性的数学符号&#xff0c;主要用于衡量算法的效率&#xff0c;特别是随着输入规模增大时算法的运行时间或占用空间的增长趋势。 基本概念 时间复杂度 描述算法所需的运行时间如何随输入数…

ensp 基于端口安全的财务部网络组建

ARP IP数据包通过以太网发送&#xff0c;但以太网设备并不能识别IP地址&#xff0c;它们是以MAC地址传输的。因此&#xff0c;必须把IP目的地址转换成MAC目的地址。在以太网中&#xff0c;一个主机要和另一个主机进行直接通信&#xff0c;必须要知道目标主机的MAC地址。 ARP&…

在 Ubuntu 上安装 Muduo 网络库的详细指南

在 Ubuntu 上安装 Muduo 网络库的详细指南 首先一份好的安装教程是非常重要的 C muduo网络库知识分享01 - Linux平台下muduo网络库源码编译安装-CSDN博客 像这篇文章就和shit一样&#xff0c;安装到2%一定会卡住&#xff0c;如果你不幸用了这个那真是遭老罪了 环境&#xf…

Idean 处理一个项目引用另外一个项目jar 但jar版本低的问题

当在idea中一个module A引用另外一个项目B的jar&#xff0c;但是从私服仓库中拉下的jar版本比较低导致编译不通过时&#xff0c;可以把项目B拉下来&#xff0c;重新编译打包jar跟新到本地的仓库 选中右边菜单的Maven 选中对应的项目B-》Lifecycle->双击 install也可以按住c…

Windows下安装Rabbit MQ

一、安装环境&#xff1a; 系统&#xff1a;windows11; 环境配置安装&#xff1a;otp_win64_25.3.2.14.exe&#xff08;erlang类库&#xff09;&#xff1b; 服务应用安装&#xff1a;rabbitmq-server-3.12.4.exe&#xff1b; 二、erlang环境&#xff1a; 1.执行…

生态学研究中,森林生态系统的结构、功能与稳定性是核心研究

在生态学研究中&#xff0c;森林生态系统的结构、功能与稳定性是核心研究内容之一。这些方面不仅关系到森林动态变化和物种多样性&#xff0c;还直接影响森林提供的生态服务功能及其应对环境变化的能力。森林生态系统的结构主要包括物种组成、树种多样性、树木的空间分布与密度…

基于UNITY3D的照片墙演示项目技术分享

unity实现超大图片墙演示,由于拥有海量图片&#xff0c;使用了CPU 多线程&#xff0c;unity dots技术&#xff0c;图片组成文字部分&#xff0c;使用了点阵图技术&#xff0c;提取文字像素。 &#xff08;关于点阵介绍&#xff09; 点阵字体是把每一个字符都分成1616或2424个点…

设计模式-访问者设计模式

介绍 访问者模式&#xff08;Visitor&#xff09;&#xff0c;表示一个作用于某对象结构中的各元素的操作&#xff0c;它使你可以在不改变个元素的类的前提下定义作用于这些元素的新操作。 问题&#xff1a;在一个机构里面有两种员工&#xff0c;1.Teacher 2.Engineer 员…

ISO/IEC 25010:2023 系统和软件的质量模型(产品质量模型)

本文是对ISO/IEC 25010 2023年底第2版&#xff1a;系统和软件工程-系统和软件质量要求与评估 (SQuaRE)-产品质量模型一文的转载&#xff0c;此外还参考了ISO/IEC 25019:2023(en) Systems and software engineering — Systems and software Quality Requirements and Evaluatio…

【零基础保姆级教程】制作自己的数据集——Labelimg的安装与使用及常见的报错解决方法

1.是什么 LabelImg 是一个图形化的图像标注工具&#xff0c;主要用于机器学习和计算机视觉领域中的数据预处理。它是由 GitHub 用户 tzutalin 开发的开源项目&#xff0c;基于 Python 和 Qt 框架编写。LabelImg 允许用户手动为图像添加边界框&#xff08;bounding boxes&#…

【java基础系列】实现数字的首位交换算法

在java中&#xff0c;手写实现一个数字的首位交换算法实现 实现效果 实现代码 核心业务代码 public static void main(String[] args) {int[] arr {1,2,3,4,5};int temp arr[0];for (int i 0; i < arr.length; i) {System.out.print(arr[i]);}System.out.println(&quo…

【java面向对象编程】第七弹----Object类、类变量与类方法

笔上得来终觉浅,绝知此事要躬行 &#x1f525; 个人主页&#xff1a;星云爱编程 &#x1f525; 所属专栏&#xff1a;javase &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 一、Object类 1.1equa…