嵌入式C语言,函数指针参数的用法详解!!!

目录

为什么有指针参数传递这种用法

函数指针参数传递用法


                        ​​​​​​​        ​​​​​​​        ​​​​​​​        编写不易,仅供学习,请勿搬运,感谢理解

嵌入式C/C++语言教程专栏文章连接

本篇万字,博客最细,嵌入式C语言基础详解教程文章!!!(学不会来找我)_csdn嵌入式学习-CSDN博客

C语言指针介绍加练习-CSDN博客

你真的理解,volatile关键字嘛?,本篇3K字,放心食用,立志最细。(看不会找我!!!)_单片机防编译优化-CSDN博客

嵌入式C语言教程·工程文件中常见的注释用法。-CSDN博客

C语言指针介绍加练习-CSDN博客

为什么有指针参数传递这种用法

        这两种用法其实涉及到了,C语言的值传递和指针传递的核心区别,在普通参数形式的C语言函数中其默认参数是值传递,在调用函数的时候,形参的值是由实参的值拷贝来的,因为这个特性就导致一种情况。

        函数的形参跟实参,虽然数值一样,但是形参确是实参的副本,形参跟实参在内存中有着不同的地址,这里形参指的就是函数形参,也就是声明函数自己构造的函数参数,实参是实际调用这个函数的时候,传进这个函数的数值。

        如果在函数代码中,对形参进行修改改的是形参的数值,影响的也是形参的地址内存中的数值,并不能影响实参放在ram里面的数值,这是因为定时函数的时候,声明的函数参数,不管是不是在函数体内,都是属于局部变量。

        函数参数属于局部变量特殊情况是当这个函数参数声明为指针的时候,虽然声明指针参数在函数中仍然是局部变量,但是可以通过解引用指针,来操作外部变量

特性值传递指针传递
参数传递的内容变量的值(副本)变量的地址
修改原始变量是否生效不会(只影响副本)会(操作的是原始变量的地址)
内存访问独立分配内存,函数返回时释放使用原始变量的内存地址
使用场景数据只需在函数内部使用需要修改外部变量时

形象对比

        ·值传递:像是用源文件的复印件来做笔记,改了复印件不会影响原笔记

        ·指针传递:直接在原件上写笔记,有改动就立即体现在原件上

函数指针参数传递用法

        函数原型,在这个函数中,声明了两个指针参数,同时在函数代码块中,对这个参数进行了赋值操作,onCounter offCounter这两个参数,在结束函数调用后,传入的实参会被改变。

u8 SwitchControl(u8 *onCounter, u8 *offCounter, FlagStatus ioStatus, u8 currentState)
{if(ioStatus)					{(*offCounter) = 2 * TIMEUNIT;if(*onCounter)(*onCounter)--;elsecurrentState = 0; // 闭合}	else{(*onCounter) = 2 * TIMEUNIT;if(*offCounter)(*offCounter)--;elsecurrentState = 1; // 断开}	return currentState;
}

        如果不使用函数参数,使用函数的形参,想要达到这个效果,需要多谢几行代码,声明一个结构体变量,声明一个结构体变量同时使用return语句,将结构体返回出去,同时在函数外,将结构体变量的值赋值给传入函数的实参,或者直接在函数中,调用实参指针,进行赋值。


u8 SwitchControl(u8 onCounter, u8 offCounter, FlagStatus ioStatus, u8 currentState, u8 *newOnCounter, u8 *newOffCounter) {if(ioStatus)					{offCounter = 2 * TIMEUNIT;if(onCounter)onCounter--;elsecurrentState = 0; // 闭合}	else{onCounter = 2 * TIMEUNIT;if(offCounter)offCounter--;elsecurrentState = 1; // 断开}// 更新新的计数值*newOnCounter = onCounter;*newOffCounter = offCounter;return currentState;
}

                                         欢迎指正,希望对你,有所帮助!!!

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

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

相关文章

基于java web在线商城购物系统源码+论文

一、环境信息 开发语言:JAVA JDK版本:JDK8及以上 数据库:MySql5.6及以上 Maven版本:任意版本 操作系统:Windows、macOS 开发工具:Idea、Eclipse、MyEclipse 开发框架:SpringbootHTMLjQueryMysq…

光谱相机在农业的应用

一、作物生长监测1、营养状况评估 原理:不同的营养元素在植物体内的含量变化会导致植物叶片或其他组织的光谱反射率特性发生改变。例如,氮元素是植物叶绿素的重要组成部分,植物缺氮时,叶绿素含量下降,其在可见光波段&a…

Qt同步读取串口

头文件 #include "InsScpi.h" #include <QObject> #include <QSerialPort>class TestSerial : public QObject {Q_OBJECT public:explicit TestSerial(QObject *parent nullptr);//打开设备bool openDevice(const QString &portName);//关闭设备…

【WRF教程第3.1期】预处理系统 WPS 详解:以4.5版本为例

预处理系统 WPS 详解&#xff1a;以4.5版本为例 每个 WPS 程序的功能程序1&#xff1a;geogrid程序2&#xff1a;ungrib程序3&#xff1a;metgrid WPS运行&#xff08;Running the WPS&#xff09;步骤1&#xff1a;Define model domains with geogrid步骤2&#xff1a;Extract…

【小问题】Java jdk下载并加入系统环境变量后命令行输入java -version没反应

问题描述如题 解决方法 1.首先检查自己的是否已经正确添加环境变量。 【设置】->【系统】->【高级系统设置】->【环境变量】->【系统变量中的PATH】->【编辑】->【复制粘贴jdk的bin文件夹路径上去】 2.⭐要把这个路径上移到最上面 我之所以会遇到这个问题就…

桌面图形界面生成原理:从流水灯到电脑屏幕

桌面图形界面是我们在使用电脑时接触最多的一个部分。它的美观、简洁、易用都给我们的生活带来了极大的便利。但是&#xff0c;你是否想过&#xff0c;这样的界面是如何生成的呢&#xff1f;让我们从流水灯的原理开始&#xff0c;一步步揭开桌面图形界面生成的奥秘。 一、流水…

IIC I2C子协议 SMBus协议 通信协议原理 时序 SMBus深度剖析

引言&#xff1a;系统管理总线&#xff08;SMBus&#xff09;是一种双线接口&#xff0c;通过该接口&#xff0c;各种系统组件芯片和设备可以相互以及与系统其他部分通信。它基于IC总线的操作原理。附录B提供了一些SMBus特性与IC总线不同的方式的描述。 SMBus为系统和电源管理相…

深入浅出:内网黄金票据与白银票据

在域环境中&#xff0c;Kerberos认证是确保安全通信的基石&#xff0c;而黄金票据和白银票据则是攻击者常用的两种经典手段。为了帮助大家更形象地理解它们的工作原理及防御措施&#xff0c;我们不妨将其与在私人电影院购票的情景做类比。具体内容参考如下图示即可&#xff1a;…

三维天地ELN助力职业卫生领域实验室无纸化、自动化

平台简介 随着国家对环保行业的日益重视,与环保行业息息相关的检测行业方法体系也越来越完善和规范。北京三维天地科技股份有限公司(以下简称“三维天地”)长期以来专注于实验室数智化建设,在环保行业拥有众多成功案例,通过自主研发的实验室信息管理系统(SW-LIMS),为客户提供完…

【渗透测试】|brupsuit的使用

一、 1.1爆破模块&#xff1a; 1、将拦截发送到intruder模块 2、在intruder模块设置pyaload位置 3、选择攻击类型 4、 5、设置好攻击类型和payload集就可以点击开始攻击&#xff0c;点击后弹出具体攻击详情 6、【payloads】模块相关 6.1 payload集为【简单列表】 添加&…

SpringBoot+Vue3实现阿里云视频点播 实现教育网站 在上面上传对应的视频,用户开会员以后才能查看视频

要使用阿里云视频点播&#xff08;VOD&#xff09;实现一个教育网站&#xff0c;其中用户需要成为会员后才能查看视频&#xff0c;这个过程包括上传视频、设置权限控制、构建前端播放页面以及确保只有付费会员可以访问视频内容。 1. 视频上传与管理 创建阿里云账号&#xff…

Docker搭建kafka环境

系统&#xff1a;MacOS Sonoma 14.1 Docker版本&#xff1a;Docker version 27.3.1, build ce12230 Docker desktop版本&#xff1a;Docker Desktop 4.36.0 (175267) 1.拉取镜像 先打开Docker Desktop&#xff0c;然后在终端执行命令 docker pull lensesio/fast-data-dev …

go语言学习005——iris框架学习

本文详细介绍了Go语言中Iris框架的使用&#xff0c;包括安装、基本HTTP请求&#xff08;GET、POST等&#xff09;的处理、自定义请求处理、用户组管理和配置设置。示例代码展示了如何创建路由、接收不同格式的请求参数、错误处理以及配置信息的动态加载。此外&#xff0c;还提到…

B树的性质和插入过程

性质 平衡性&#xff1a;所有叶子节点都在同一层多路&#xff1a;m 阶 B 树 最多&#xff1a; m 个分支&#xff0c;m-1 个元素 最少&#xff1a; 根节点 2 个分支 1个元素 其他节点 ⌈ m / 2 ⌉ \lceil m/2\rceil ⌈m/2⌉ 个分支 ⌈ m / 2 ⌉ \lceil m/2\rceil ⌈m/2⌉ −…

基于预测反馈的情感分析情境学习

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

Qt设置部件的阴影效果

QT中的比如QWidget,QLabel,QPushbutton&#xff0c;QCheckBox都可以设置阴影效果&#xff0c;就像这样&#xff1a; 以QWidget为例&#xff0c;开始尝试使用样式表的形式添加阴影&#xff0c;但没有效果&#xff0c;写法如下&#xff1a; QWidget#widget1::shadow{color: rgb…

如何用Redis实现分布式锁?

theme: smartblue 分布式锁是什么&#xff1f;为什么要有这个技术&#xff0c;解决了什么问题&#xff1f; 讲到分布式锁&#xff0c;我们会很容易联想到单机锁。在java多线程编程中&#xff0c;通常我们会使用锁来保护共享变量&#xff0c;来保证线程安全。这里面的锁作用范…

AS-REP Roasting离线爆破攻击

针对一个域内用户&#xff0c;其账户选项有个设置叫作 “不要求 kerberos 预身份验证”&#xff0c;它默认是关闭的。 当 “不要求 kerberos 预身份验证” 选项被勾选&#xff0c;会出现以下效果&#xff1a; as-req 报文中不需要添加用户 hash 加密的时间戳&#xff0c;自动返…

JMeter配置原件-计数器

一、面临的问题&#xff1a; 由于本人的【函数助手对话框】中counter计数器每次加2&#xff0c;且只显示偶数(如下图所示)&#xff0c;因此借助【配置原件-计数器】来实现计数功能。 如果有大佬知道解决方式&#xff0c;麻烦评论区解答一下&#xff0c;谢谢。 二、配置原件-c…

基于“2+1 链动模式商城小程序”的微商服务营销策略探究

摘要&#xff1a;本文探讨在竞争激烈的市场经济与移动互联网时代背景下&#xff0c;微商面临的机遇与挑战。着重分析“21 链动模式商城小程序”如何助力微商改变思路&#xff0c;通过重视服务、提升服务质量&#xff0c;以服务营销放大利润&#xff0c;实现从传统微商模式向更具…