C 语言回调函数

 回调函数的概念

您的理解是正确的。pFunCallBack 是一种函数指针类型,它定义了函数的签名(即函数的参数类型和返回类型)。当我们说 pFunCallBack pFun,我们是在声明一个变量 pFun,其类型是 pFunCallBack —— 即一个函数指针,该指针可以存储指向任何具有相同签名的函数的地址。

transFrom 函数中,pFun 作为参数接收这样的一个函数地址。当我们将 show 函数作为参数传递给 transFrom 函数时,我们实际上是在传递 show 函数的地址,这使得 transFrom 能够调用 show 函数来处理数组中的每个元素。

这里的关键点是,show 函数的签名(即它接受一个整型指针作为参数且没有返回值)与 pFunCallBack 类型相匹配,这意味着 show 可以被安全地存储在 pFun 函数指针变量中,并在 transFrom 函数内部被调用。

transFrom 在其循环中遇到数组的每个元素时,它通过 pFun 指针调用 show 函数,传递当前元素的地址。show 函数随后使用 printf 打印该元素的值。这种设计允许 transFrom 函数非常灵活,因为它可以被配置为使用不同的回调函数执行不同的操作,而不必修改函数本身。

 数组指针指向的是数组的地址,函数指针指向的是函数的地址,函数的名字表示地址的首元素

#define  _CRT_SECURE_NO_WARNINGS
#include "math.h"
#include <string.h>
#include "add.h"
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>// 创建函数指针类型
typedef void(*pFunCallBack)(int);// 回调登记函数
void transFrom(int arr[],int len,pFunCallBack pFun) 
{for (int i; i < len; i++) {pFun(arr[i]);}
}// 回调函数用来输出数组中的数据
void show(int num) 
{printf("%d ", num);
}int main()
{int arr[5] = { 1,2,3,4,5 };transFrom(arr, 5, show);return 0;
}

 


回调函数不同的函数操作

#define  _CRT_SECURE_NO_WARNINGS
#include "math.h"
#include <string.h>
#include "add.h"
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>// 创建函数指针类型
typedef void(*pFunCallBack)(int*);// 回调登记函数
void transFrom(int arr[],int len,pFunCallBack pFun) 
{for (int i = 0; i < len; i++) {pFun(&arr[i]);}
}// 回调函数用来输出数组中的数据
void show(int *num) 
{printf("%d ", *num);
}void add1(int *num) 
{(*num)++;
}// 把数组逆序
void reverse(int* num) 
{// 获取到数组的一个if (*num < *(num + 1)) {int t = *num;*num = *(num + 1);*(num + 1) = t;}
}int main()
{int arr[5] = { 1,2,3,4,5 };transFrom(arr, 5, show);transFrom(arr, 5, add1);putchar('\n');transFrom(arr, 5, show);putchar('\n');for (int i = 0; i < 5; i++) {transFrom(arr, 5, reverse);}transFrom(arr, 5, show);return 0;
}

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

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

相关文章

暗网与深网的技术原理、应用及社会影响探究

一、引言 互联网已经成为现代社会不可或缺的一部分&#xff0c;它不仅改变了人们的生活方式&#xff0c;也深刻影响着社会的经济、政治和文化等各个领域。然而&#xff0c;在互联网的广阔领域中&#xff0c;存在着一些不为人知的部分&#xff0c;即深网和暗网。深网和暗网的出现…

PHP项目开发流程概述

PHP项目开发流程是一个系统性的过程&#xff0c;它涵盖了从项目启动到最终部署及维护的各个阶段。以下是对PHP项目开发流程的详细概述&#xff0c;并附有相关代码示例。 一、需求分析 概述&#xff1a; 需求分析是项目开发的起始点&#xff0c;主要目的是明确项目的目标、功能…

推荐4款高清稳定的远程控制软件。

远程控制软件已经在我们生活中的很多场景里都排上了用场&#xff0c;它可以帮助我们灵活办公&#xff0c;教育学习&#xff0c;游戏娱乐&#xff0c;技术支持等。如果你刚好需要远程控制设备的话&#xff0c;可以看看这4款软件&#xff0c;连接稳定高清&#xff0c;操作简单。 …

Java中的Heap(堆)(如果想知道Java中有关堆的知识点,那么只看这一篇就足够了!)

前言&#xff1a;&#xff08;Heap&#xff09;是一种特殊的完全二叉树&#xff0c;它在诸多算法中有着广泛的应用&#xff0c;本文将详细介绍Java中的堆。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 先让我们看一下本文大…

生成式人工智能落地校园与课堂的15个场景

生成式人工智能正在重塑教育行业&#xff0c;为传统教学模式带来了革命性的变化。随着AI的不断演进&#xff0c;更多令人兴奋的应用场景将逐一显现&#xff0c;为学生提供更加丰富和多元的学习体验。 尽管AI在教学中的应用越来越广泛&#xff0c;但教师们也不必担心会被完全替代…

细水长流:使用Scikit-Learn实现模型的增量预测

细水长流&#xff1a;使用Scikit-Learn实现模型的增量预测 在机器学习领域&#xff0c;增量学习是一种允许模型在新数据到来时不断更新和学习的范式。Scikit-Learn&#xff08;简称sklearn&#xff09;&#xff0c;作为Python中广受欢迎的机器学习库&#xff0c;提供了一些支持…

什么是区块链

区块链&#xff0c;这个听起来既神秘又前沿的技术&#xff0c;实际上是一个结合了信息技术、密码学、分布式计算等多个领域的创新概念。通俗来说&#xff0c;区块链就像是一个由无数个小记事本&#xff08;区块&#xff09;通过特殊方式串联起来的大账本&#xff0c;每个小记事…

MySQL(事务、索引)MyBatis

目录 事务 概述 四大特性&#xff08;ACID&#xff09; 索引 结构 语法 MyBatis 数据库连接池 lombok 基本操作--增删改查 根据主键删除 新增 更新 查询&#xff08;根据ID查询&#xff09; 查询&#xff08;条件查询&#xff09; XML映射文件 动态SQL 动态条…

[图解]《分析模式》漫谈16-“我用的”不能变成“我的”

1 00:00:00,720 --> 00:00:02,160 今天&#xff0c;我们来说一下 2 00:00:02,170 --> 00:00:04,850 “我用的”不能变成“我的” 3 00:00:04,860 --> 00:00:11,390 《分析模式》的前言 4 00:00:12,260 --> 00:00:13,410 有这么一句话 5 00:00:14,840 --> 0…

Windows安装go语言开发环境

一、下载安装包 安装包下载地址 下载完毕后双击进行安装。 查看是否安装成功&#xff1a; go version #查看go版本 go env #查看go环境变量正常显示则安装完成。 二、安装vscode 一般开发go语言项目使用vscode工具&#xff1a; 下载地址 下载完毕后双击进行安装。 三…

【鸿蒙学习笔记】UI・常用组件・Button・按钮组件・ButtonType

官方文档&#xff1a;按钮 (Button) 目录标题 ButtonType ButtonType 胶囊类型&#xff08;Capsule&#xff09;・圆形按钮&#xff08;Circle&#xff09;・普通按钮&#xff08;Normal&#xff09;・自定义 Column({ space: 10 }) {Text(Normal).fontSize(20).fontColor(Col…

【人工智能 | 机器学习 | 理论篇】模型评估与选择

文章目录 1. 经验误差与过拟合2. 模型评估方法2.1 模型评估概念2.2 留出法2.3 k 折交叉验证法2.4 自助法2.5 调参与最终模型 3. 性能度量3.1 均方误差3.2 错误率、精度3.3 查准率、查全率3.3 扩展3.4 ROC 与 AUC3.5 代价敏感错误率与代价曲线 4. 比较检验4.1 假设检验4.2 交叉验…

使用Java填充Word模板的技术详解

目录 概述常见的Java Word处理库 Apache POIAspose.Words for JavaDocx4j 使用Apache POI填充Word模板 创建和读取Word文档填充文本填充表格 使用Aspose.Words for Java填充Word模板 创建和读取Word文档填充文本填充表格 使用Docx4j填充Word模板 创建和读取Word文档填充文本填…

【一次记一句:SQL】从 information_schema.TABLES中查询数据库表中记录数据量

有时候&#xff0c;一张千万数据量的表&#xff0c;使用 count(*) 统计记录数&#xff0c;查不动。可以使用下述SQL来试试&#xff1a; SELECT CONCAT(table_schema, ., table_name) AS "Table Name", table_rows AS "Number of Rows", CONCAT(ROUND(data…

uniapp小程序项目解决键盘问题

1. 点击输入框&#xff0c;使页面不上移&#xff0c;并实现软键盘弹出。 步骤&#xff1a; 1. 使用adjust-position属性&#xff0c;禁止页面上移&#xff1b; 2. 但此时如果输入框在底部&#xff0c;当点击输入时&#xff0c;键盘会弹起&#xff0c;这时候需要动态移动输入框的…

matlab中plot的一些用法

文章目录 一、基本用法二、绘制多个数据集三、设置线型、颜色四、添加标题和标签五、添加图例六、设置轴范围七、绘制网格八、 在同一图中绘制多个子图九、绘制带误差条的图十、绘制半对数图和对数图十一、绘制填充区域图十二、综合案例 一、基本用法 x 0:0.1:10; y sin(x);…

技术成神之路:设计模式(八)责任链模式

介绍 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为设计模式&#xff0c;它允许多个对象依次处理请求&#xff0c;避免请求的发送者和接收者之间的显式耦合。该模式通过将多个可能处理请求的对象连接成一条链&#xff0c;并沿着这条链传递请求…

【乐吾乐2D可视化组态编辑器】切换画面

切换画面 乐吾乐2D可视化组态编辑器demo&#xff1a;https://2d.le5le.com/ 方式1&#xff1a;open切换 推荐使用meta2d.open切换新画面 const pen {name: "rectangle",text: "矩形",x: 100,y: 100,width: 100,height: 100,events: [{name: "c…

Cadence23导入板框时的疑难杂症

1.为啥导入板框之后元器件找不到了呢&#xff1f; 因为导入板框的时候没有勾选 增加量 &#xff0c;导致导入的板框新建了一个文件&#xff1a; 2.导入板框之后3D显示还是不没有导入呀&#xff1f; 那是因为导入的板框还带有铜皮属性&#xff0c;需要change命令把其换为板框…

【算法】算法模板

算法模板 文章目录 算法模板简介数组字符串列表数学树图动态规划 简介 博主在LeetCode网站中学习算法的过程中使用到并总结的算法模板&#xff0c;在算法方面算是刚过初学者阶段&#xff0c;竞赛分数仅2000。 为了节省读者的宝贵时间&#xff0c;部分基础的算法与模板未列出。…