函数指针和回调函数

文章目录

  • 一.函数指针
    • 1.什么是函数指针
    • 2.函数指针的形式
    • 3.函数指针的用途。
      • 1.调用函数
      • 2.作为参数进行传递
  • 二.函数指针数组
  • 三.回调函数

一.函数指针

1.什么是函数指针

  • 函数指针是指向函数的指针。在C语言和C++中,函数指针可以用来存储函数的地址,并且可以通过函数指针来调用函数。
  • 也可以作为函数的返回值。通过函数指针,可以实现回调函数和动态函数调用等功能。
  • 通过函数指针,可以实现回调函数和动态函数调用等功能。函数指针的类型由函数的参数和返回值类型来确定。函数指针在一些高级的编程技术中经常被使用,例如函数指针数组、函数指针作为结构体成员等。

2.函数指针的形式

在了解形式之前,我们需要知道一个小细节
自定义函数名和取地址函数名是等价的

void test()
{return;
}
int main()
{printf("%p\n", test);printf("%p\n", &test);
}

在这里插入图片描述
所以我们书写就会有两种形式:

void (*pf1)() = &test;
void (*pf2)()= test;

如果函数需要传参,返回值,则括号里要表达形式

int Add(int x, int y)
{
return x+y;
}
int (*pf3) (int x,int y)
//也可以省略x,y
int (*pf4) (int ,int )

3.函数指针的用途。

1.调用函数

通过直接解引用,并且传参就可以直接调用

int Add(int x, int y)
{return x + y;
}
int main()
{int (*pf1) (int, int) = Add;//直接调用printf("%d\n", Add(1, 8));//指针解引用printf("%d\n", (*pf1)(1, 8));
}

在这里插入图片描述

2.作为参数进行传递

虽然函数可以全局调用,但是有时候我们需要在程序运行时动态地确定调用哪个函数,或者需要将函数作为参数传递给其他函数。这时候就需要使用函数指针作为参数。

二.函数指针数组

函数指针数组是一个数组,其中的每个元素都是一个函数指针。函数指针数组可以用来存储多个函数的地址,从而可以根据需要动态地选择并调用不同的函数。
形式如下:

void (*functions[2])() = {function1, function2};

我们接下来展示一段简易代码,利用函数指针数组做一个转移表实行计算器的部分功能:

int Add(int x, int y)
{return x + y;
}
int Mul(int x, int y)
{return x * y;
}
int Sub(int x, int y)
{return x - y;
}
int Div(int x, int y)
{return x / y;
}
int main()
{int x, y;int input = 1;//将函数封装进数组int(*p[5]) (int, int) = { NULL,Add,Mul,Sub,Div };//打印菜单do {printf("***************************\n");printf("***************************\n");printf("****0:退出   1:加法 ******\n");printf("****2:乘法  3:减法 ******\n");printf("****4:除法          ******\n");printf("***************************\n");printf("***************************\n");scanf("%d", &input);if (input<5&&input>0){printf("请输入你要计算的数字x,y\n");scanf("%d %d", &x, &y);int ret =(p[input](x, y));//调用printf("结果是:%d\n",ret );}else break;} while (input);return 0;
}

由此我们可知相同参数和类型近似的函数可以通过函数指针数组分装使用

三.回调函数

回调函数是指在某个函数执行过程中,通过函数指针调用另一个函数的过程。通常情况下,回调函数作为参数传递给某个函数,并在该函数特定的条件下被调用。

回调函数通常用于实现一些灵活的、可定制的功能,例如事件处理、状态通知、数据处理等。通过回调函数,可以将特定的处理逻辑从原始函数中分离出来,使得原始函数具有更高的通用性和灵活性。
在c语言中有一个经典的库函数qsort,它的底层逻辑是快速排序,他需要用户自己实现比较部分函数
在这里插入图片描述

void qsort(void *base, size_t num, size_t size, int (*compar)(const void *, const void *));

四个参数分别为:

1.void *base:指向待排序数组的指针,即数组的首元素地址。
qsort 函数通过这个指针来访问待排序的元素。2.size_t num:数组中待排序元素的个数。3.size_t size:每个元素的大小(以字节为单位)。
由于 qsort 函数不知道数组中元素的具体类型,
因此需要通过 size 参数来确定每个元素的大小。4.int (*compar)(const void *, const void *):指向比较函数的指针。
比较函数的原型必须是 int compar(const void *a, const void *b),
其中 a 和 b 是待比较的两个元素的指针。
比较函数需要根据实际的排序需求来定义,
返回值为负数表示 a 应该排在 b 前面,
返回值为正数表示 a 应该排在 b 后面,
返回值为 0 表示 a 和 b 相等。

展示一个简单排序:

int compare(const void* a, const void* b)
{return *((int*)a) - *((int*)b);
}
int main()
{int arr[10] = { 2,5,7,4,6,1,5,0,9,7 };//排序qsort(arr, 10, sizeof(int), compare);for (int i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}

在这里插入图片描述

不光是整形排序,void类型意味着可以兼容各种数据的排序。
在这里插入图片描述
本期的知识分享到此结束。希望三联支持一下博主!

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

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

相关文章

【操作系统】优化MBR程序:让MBR调用显存吧

一.显存、显卡以及显示器的概述 显卡用于连接CPU和显示器&#xff0c;我们调用显示器时&#xff0c;其实就是利用显卡提供的IO接口间接地对显示器进行操作&#xff0c;所以显卡也称之为显示适配器。接下来我们将优化之前写的MBR程序&#xff08;参考&#xff1a;【操作系统】BI…

经管类CSSCI、北核期刊投稿指南数据(2023年更新)/经管类的期刊投稿指南

经管类CSSCI、北核期刊投稿指南&#xff08;2023年更新&#xff09; 1、内容包括&#xff1a;投稿指南-CSSCI版本、CSSCI扩展版本、北大核刊版本、建议期刊版本、所有期刊。 2、范围&#xff1a;CSSCI、CSSCI扩展、北大核刊 3、说明&#xff1a;包含经管类期刊的发表难度&am…

【LeetCode】2626. 数组归约运算

数组归约运算 题目题解 题目 给定一个整数数组 nums、一个 reducer 函数 fn 和一个初始值 init&#xff0c;返回通过依次对数组的每个元素执行 fn 函数得到的最终结果。 通过以下操作实现这个结果&#xff1a;val fn(init, nums[0])&#xff0c;val fn(val, nums[1])&#…

AlexNet论文翻译与精读

1:该论文解决了什么问题&#xff1f; 图像分类问题 2&#xff1a;该论文的创新点&#xff1f; 1:使用了大的深的卷积神经网络进行图像分类&#xff1b; 2:采用了两块GPU进行分布式训练&#xff1b; 3:采用了Relu进行训练加速&#xff1b; 4:采用局部归一化提高模型泛化能…

Qt 窗口阴影边框

环境&#xff1a;Qt 5.15 VS2019 方法一&#xff1a;QGraphicsDropShadowEffect 实现方法参考链接&#xff1a;https://blog.csdn.net/goforwardtostep/article/details/99549750 使用此方法添加窗口阴影&#xff0c;会出现警告信息&#xff1a; 且窗口最大化与还原切换时会…

多态、抽象类和接口(深拷贝和浅拷贝)

目录​​​​​​​ 前言&#xff1a; 多态&#xff1a; 多态的定义&#xff1a; 向上转型&#xff1a; 方法重写&#xff1a; 再看toString方法&#xff1a; 动态绑定&#xff1a; 向下转型&#xff1a; 小练习&#xff1a; 抽象类&#xff1a; 什么是抽象类&am…

Logstash应用-同步ES(elasticsearch)到HDFS

1.场景分析 现有需求需要将elasticsearch的备份至hdfs存储&#xff0c;根据以上需求&#xff0c;使用logstash按照天级别进行数据的同步 2.重难点 数据采集存在时间漂移问题&#xff0c;数据保存时使用的是采集时间而不是数据生成时间采用webhdfs无法对文件大小进行设置解决…

水产冷链物流行业零下25℃库架一体 海格里斯HEGERLS四向穿梭式冷藏冷库智能密集仓

随着国内外仓储物流整体规模和低温产品消费需求的稳步增长&#xff0c;冷链市场应用潜力不断释放。在传统“货架叉车”的方式下&#xff0c;货物、人员及机械设备不断进出&#xff0c;容易造成温度波动&#xff0c;导致冷量流失。立体冷库则以更高密度、更具成本效益的方式&…

性能测试中TPS上不去的几种原因浅析

昨晚在某个测试群看到有人问了一个问题&#xff1a;压力测试中TPS一直上不去&#xff0c;是什么原因&#xff1f;稍微整理了下思路&#xff0c;列举性的简略回答了他的问题。 这篇博客&#xff0c;就具体说说在实际压力测试中&#xff0c;为什么有时候TPS上不去的原因。如有遗…

C++学习笔记(三十五):c++ 函数指针及lambda表达式

本节介绍c函数指针。在一些源码中经常能看到c函数指针&#xff0c;但之前一直觉着这一块比较复杂&#xff0c;就一直没去仔细研究&#xff0c;终于有时间去仔细研究这一块内容了。 c风格的函数指针 函数指针是指将一个函数赋值给一个变量的方法&#xff0c;可以将函数作为一个参…

Vercel配置自定义域名

首先你需要有一个域名 1.点击部署的项目设置 2.找到Domains 3.输入自己的域名 点击添加之后按要求去域名服务商添加解析即可 4.显示下面内容就设置完成了&#xff0c;

激活/注册navicat15

一、获取软件 链接&#xff1a;https://pan.baidu.com/s/1F_tiLuLvVFMEz8pDfIvDjw?pwdjjfj 提取码&#xff1a;jjfj 二、安装 安装的过程我就不放了&#xff0c;重点如下 安装完不要打开软件&#xff01; 安装完不要打开软件&#xff01; 安装完不要打开软件&#xff01;…

强化学习求解TSP(三):Qlearning求解旅行商问题TSP(提供Python代码)

一、Qlearning简介 Q-learning是一种强化学习算法&#xff0c;用于解决基于奖励的决策问题。它是一种无模型的学习方法&#xff0c;通过与环境的交互来学习最优策略。Q-learning的核心思想是通过学习一个Q值函数来指导决策&#xff0c;该函数表示在给定状态下采取某个动作所获…

回首24考研历程,那些无法忘却的收获

文章目录 毅力与坚持&#x1f44d;知识的力量&#x1f9d0;心态的历练&#x1f913;友谊与互助( •̀ ω •́ )y未来的启示(●◡●) 在这个充满希望与挑战的时刻&#xff0c;我想与你们分享一段关于2023这一年特别的经历——考研之路。这段旅程既有磨砺的痛楚&#xff0c;也有…

小程序基础学习(事件处理)

概述&#xff1a;点击某一个标题&#xff0c;使标题选中增加不同颜色。 <!--pages/four/four.wxml--> <navigation-bar title"牧原" back"{{false}}" color"black" background"#FFF"></navigation-bar> <view c…

2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷⑩

2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷10 目录 需要竞赛软件包环境以及备赛资源可私信博主&#xff01;&#xff01;&#xff01; 2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷10 模块…

RT-Thread: ulog 日志 讲解和使用

说明&#xff1a;记录 RT-Thread: ulog 日志功能和使用流程。 官网资料链接&#xff1a; https://docs.rt-thread.org/#/rt-thread-version/rt-thread-standard/programming-manual/ulog/ulog 1.ulog 简介 日志的定义&#xff1a;日志是将软件运行的状态、过程等信息&#x…

海外市场调研为什么要用独享静态代理IP?

独享静态IP在海外市场调研中扮演着至关重要的角色&#xff0c;提供了一系列无可比拟的优势。独享静态代理IP的稳定性和可靠性对于长期的市场调研至关重要&#xff0c;它保证了连接的持续性和数据的准确性。通过这些方面的综合优势&#xff0c;独享静态代理IP成为海外市场调研中…

工业智能网关:HiWoo Box远程采集设备数据

工业智能网关&#xff1a;HiWoo Box远程采集设备数据 在工业4.0和智能制造的浪潮下&#xff0c;工业互联网已成为推动产业升级、提升生产效率的关键。而在这其中&#xff0c;工业智能网关扮演着至关重要的角色。今天&#xff0c;我们就来深入探讨一下工业智能网关。 一、什么…

用Linux的视角来理解缓冲区概念

缓冲区的认识 缓冲区&#xff08;buffer&#xff09;是存储数据的临时存储区域。当我们用C语言向文件中写入数据时&#xff0c;数据并不会直接的写到文件中&#xff0c;中途还经过了缓冲区&#xff0c;而我们需要对缓冲区的数据进行刷新&#xff0c;那么数据才算写到文件当中。…