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.tpcf.cn/diannao/48334.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;部分基础的算法与模板未列出。…