2-7 C函数指针与回调函数

前言:


对函数指针与回调函数知识回顾,仅供学习参考...


目录

前言:

1.0 函数指针

2.0 函数指针变量

3.0 函数指针与指针函数

4.0 函数指针类型

5.0 卡点

后记:


1.0 函数指针


函数指针,简单来说就是指向函数的指针,为什么要使用函数指针?


我们编写的上层应用代码毫无疑问会调用下层的库代码,包括标准库、单片机或者GUI的库,
像printf()、malloc()等等,通常调用流程是:

 在某些场景,调用流程要反过来,比如使用下层库里的定时功能,每隔1S,即时通知上
层的业务去刷新时钟的UI界面,如何通知?很多库代码是闭源的,我们不可能在库中添
加业务代码函数,也就没办法直接调用,但是C语言提供了函数指针和回调函数机制通过
实现下层通知上层的功能。


2.0 函数指针变量


函数返回值类型(* 函数指针变量名)(函数参数列表);

int32_t (*pSum)(int32 t a, int32 t b);

这条语句定义了一个名为 pSum 的指针,它指向一个函数,该函数接收两个 int32_t 类型的参数,并返回一个 int32_t 类型的结果

函数的数据类型,可以描述为 int32_t (*)(int32_t, int32_t)。这表示任何具有这种签名(即接受两个 int32_t 参数并返回 int32_t)的函数都可以赋值给 pSum。

函数指针变量pSum,就像int32t*ptr里的ptr一样,函数名称就像数组名称一样保存了函数地址:

(*pSum)(1,2),表示间接访问并调用Sum函数

int32_t Sum(int32_t x, int32_t y)
{return x + y;
}int main(void)
{// 创建函数指针变量int32_t (*pSum)(int32_t a, int32_t b);// 将函数的地址赋值给函数指针变量pSum = Sum;// 打印输出函数与函数指针地址printf("pSum = 0x%p , Sum = 0x%p\n",pSum, Sum);// 调用函数int32_t sum = (*pSum)(1, 2);printf("%d\n",Sum);return 0;
}

运行以上程序输出如下结果:


3.0 函数指针与指针函数

int32 t(*psum)(int32 t a, int32 t b);为什么(*psum)要使用()?

如果不使用(),变成了int32 t *pSum(int32 ta, int32 tb);基于运算符优先级,pSum先结合()再结合*,这种格式被称为指针函数,表示返回值为指针类型的函数比如常见的: 

void *malloc(size t size)
char *strcpy(char *dest, const char *src)

 使用(),基于运算符优先级,pSum先结合*再结合后面的(),这种格式用来定义函数指针变量,变量是pSum.

函数指针

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>int32_t Sum(int32_t x, int32_t y)
{return x + y;
}void Handle(int32_t (*pSum)(int32_t a, int32_t b))
{int32_t sum = (*pSum)(1, 2);printf("%d\n",sum);
}int main(void)
{Handle(Sum);return 0;
}

运行以上程序输出如下结果:


4.0 函数指针类型

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>typedef int32_t (*pSum)(int32_t a, int32_t b);int32_t Sum(int32_t x, int32_t y)
{return x + y;
}void Handle(pSum psum)
{int32_t sum = psum(1, 2);printf("%d\n",sum);
}int main(void)
{Handle(Sum);return 0;
}

运行以上程序输出如下结果:


typedef int32_t (*PFUNC)(int32 t a, int32 t b);



5.0 卡点


typedef int32_t (*pSum)(int32_t a, int32_t b);
  • typedef 关键字用于创建一个新的类型别名,
  • int32_t(*psum)(int32_t a,int32t b)定义了一个函数指针类型,
  • int32_t 是函数的返回类型
  • (*pSum)表示 psum 是一个指向函数的指针
  • (int32_ta,int32tb)是该函数接受的参数列表

通过 typedef,你创建了一个新的类型别名 pSum,这个别名代表一个函数指针类型,该指针指向一个接受两个 int32_t 类型参数并返回一个 int32_t 类型值的函数。

pSum 本身不是一个指针变量,而是一个函数指针类型。你可以使用 pSum 类型来声明函数指针变量。

pSum myFunctionPointer;

这里的 myFunctionPointer 是一个函数指针变量,它的类型是 pSum,也就是说:myFunctionPointer 可以指向一个接受两个 int32_t 类型参数并返回一个 int32_t 类型值的函数


后记:

本人对相关知识回顾与思考,仅供学习参考...

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

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

相关文章

分布式FastDFS存储的同步方式

目录 一&#xff1a;FatsDFS的结构图 二&#xff1a;FatsDFS文件同步 前言&#xff1a; 1&#xff1a;同步日志所在目录 2&#xff1a;binlog格式 3&#xff1a;同步规则 4&#xff1a;binlog同步过程 1 &#xff1a;获取组内的其他Storage信息 tracker_report_thread_e…

【大模型】ChatGPT 提示词优化进阶操作实战详解

目录 一、前言 二、ChatGPT 提示词几个基本的优化原则 2.1 明确的提示词 2.1.1 提示词具体而清晰 2.1.1.1操作案例演示 2.2 确定焦点 2.2.1 操作案例演示 2.3 保持提示词的相关性 2.3.1 什么是相关性 2.3.2 提示词相关性操作案例一 2.3.2 提示词相关性操作案例二 三…

C 语言学习的经典书籍有哪些?

学习C语言的理由 C语言是一种程席设计语言&#xff0c;它是由美国AT&T公司贝尔实验室的Dennis Ritchie于1972年发明的。C语言之所以流行&#xff0c;是因为它简单易用。学习C语言的几个理由如下&#xff1a; (1)C、C#和Java使用一种被称为面向对象程序设计(0bject-Orient…

在鲲鹏麒麟服务器上部署MySQL主从集群

因项目需求需要部署主从MySQL集群&#xff0c;继续采用上次的部署的MySQL镜像arm64v8/mysql:latest&#xff0c;版本信息为v8.1.0。计划部署服务器192.168.31.100和192.168.31.101 部署MySQL主节点 在192.168.31.100上先创建好/data/docker/mysql/data和/data/docker/mysql/l…

Transformers在计算机视觉领域中的应用【第2篇:MAE——BERT的CV版本】

目录 1 介绍2 模型示意图3 MAE算法4 总结 论文&#xff1a;Masked Autoencoders Are Scalable Vision Learners 代码&#xff1a;https://github.com/facebookresearch/mae 1 介绍 MAE是基于ViT的&#xff0c;将整个训练拓展到没有标号的数据上面&#xff0c;和BERT一样&#…

WebGL vendor [显卡]指纹

一、WebGL vendor&#xff1a;(厂商) Google Inc. (NVIDIA) c定义在 third_party\angle\src\libANGLE\Display.cpp 格式化Google Inc.字符在Display::initVendorString()函数里面&#xff0c;可以在此修改值。 void Display::initVendorString() {mVendorString …

stable diffusion实践操作-大模型介绍:SD的发展历史,SD1.5和SDXL之间的差别

大家有没有这样的困惑&#xff1a;在找模型时&#xff0c;老是会出现一些奇怪的标签&#xff0c;像 sd1.5、sdxl 之类的模型后缀&#xff0c;真让人摸不着头脑&#xff0c;一会儿 1.0&#xff0c;一会儿 1.5&#xff0c;一会儿 XL&#xff0c;完全搞不清楚状况。今天就来给大家…

网络编程第二课

预备知识 1、操作系统的用户态和内核态&#xff1a; 用户态指的是用户自己定义工作空间&#xff0c;自己申请变量、定义函数的操作。 内核态指把一些工作交给操作系统去玩成&#xff0c;用户本身看不到执行过程&#xff0c;只能获取操作系统最后执行完成的结果。其中&#x…

Python酷库之旅-第三方库Pandas(252)

目录 一、用法精讲 1191、pandas.tseries.offsets.BusinessMonthBegin.n属性 1191-1、语法 1191-2、参数 1191-3、功能 1191-4、返回值 1191-5、说明 1191-6、用法 1191-6-1、数据准备 1191-6-2、代码示例 1191-6-3、结果输出 1192、pandas.tseries.offsets.Busine…

IO流之文件

1. 文件流 2. 常用文件操作 2.1 文件创建 方式1 new File(String pathname) // 根据路径创建一个File对象 方式2 new File(File parent,String child) //根据父目录文件子路径构建 方式3 new File(String parent,String child) //根据父目录子路径构建 package com.hspedu.fil…

【从零开始的LeetCode-算法】35. 搜索插入位置

给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2示例 2: 输入: …

C++(4个类型转换)

1. C语言中的类型转换 1. 隐式 类型转换&#xff1a; 具有相近的类型才能进行互相转换&#xff0c;如&#xff1a;int,char,double都表示数值。 2. 强制类型转换&#xff1a;能隐式类型转换就能强制类型转换&#xff0c;隐式类型之间的转换类型强相关&#xff0c;强制类型转换…

深度学习7 梯度下降优化、过拟合、手机价格预测

三、BP算法 3、梯度下降 w w - lr * grad&#xff1a; w 表示权重&#xff0c;lr表示学习率&#xff0c;grad表示梯度 传统下降方式分三类&#xff1a;&#xff08;BGD&#xff09;批量梯度下降、&#xff08;MBGD&#xff09;小批量梯度下降、&#xff08;SGD&#xff09;随…

计算机的错误计算(一百七十二)

摘要 探讨 MATLAB 对于算式 的计算误差。 例1. 在 MATLAB 中计算 的值。 直接贴图吧&#xff1a; 这样&#xff0c;MATLAB 的输出中只有3位正确数字&#xff0c;有效数字的错误率为 (16-3)/16 81.25% . 因为16位的正确输出为 0.2971242332737277e-18&#xff08;ISReals…

手撸了一个文件传输工具

在日常的开发与运维中&#xff0c;文件传输工具是不可或缺的利器。无论是跨服务器传递配置文件&#xff0c;还是快速从一台机器下载日志文件&#xff0c;一个高效、可靠且简单的文件传输工具能够显著提高工作效率。今天&#xff0c;我想分享我自己手撸一个文件传输工具的全过程…

新手参加2025年CTF大赛——Web题目的基本解题流程

CTF&#xff08;Capture the Flag&#xff09;是网络安全比赛中的一种常见形式&#xff0c;参赛者需要通过破解题目、发现漏洞并获取flag&#xff08;标志&#xff09;来获得分数。 这些问题涉及多个领域&#xff0c;如逆向工程、Web安全、密码学、二进制漏洞、取证分析等。CTF…

1Panel 自建邮局 - Docker Mailserver

本文首发于 Anyeの小站&#xff0c;点击链接 访问体验更佳 前言 首先发一段劝退说辞&#xff1a;我相信点进本文的人自建邮局的目的更多地是为了能用自己的域名邮箱&#xff0c;收发邮件&#xff1f; 仅收不发&#xff0c;推荐使用 https://www.cloudflare.com/zh-cn/develop…

【Maven】功能和核心概念

1. 什么是Maven 1.1 Maven的概念 Maven 是 Apache 软件基金会组织维护的一款自动化构建工具&#xff0c;专注服务于 Java 平台的项目构建和依赖管理。 1.2 为什么要使用Maven&#xff1f; 在项目开发中&#xff0c;我们需要引用各种 jar 包&#xff0c;引用的 jar 包可能有…

企业网站面临的爬虫攻击及安全防护策略

在当今数字化时代&#xff0c;企业网站不仅是展示企业形象的窗口&#xff0c;更是进行商业活动的重要平台。然而&#xff0c;企业网站在日常运营中面临着多种类型的爬虫攻击&#xff0c;这些攻击不仅会对网站的正常访问造成影响&#xff0c;还可能窃取敏感数据&#xff0c;给企…

vue3 + vite + antdv 项目中自定义图标

前言&#xff1a; 去iconfont-阿里巴巴矢量图标库 下载自己需要的icon图标&#xff0c;下载格式为svg&#xff1b;项目中在存放静态资源的文件夹下 assets 创建一个存放svg格式的图片的文件夹。 步骤&#xff1a; 1、安装vite-plugin-svg-icons npm i vite-plugin-svg-icons …