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

news2024/12/22 15:03:51

目录

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

函数指针参数传递用法


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

嵌入式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)--;
        else
            currentState = 0; // 闭合
    }	
    else
    {
        (*onCounter) = 2 * TIMEUNIT;
        if(*offCounter)
            (*offCounter)--;
        else
            currentState = 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--;
        else
            currentState = 0; // 闭合
    }	
    else
    {
        onCounter = 2 * TIMEUNIT;
        if(offCounter)
            offCounter--;
        else
            currentState = 1; // 断开
    }

    // 更新新的计数值
    *newOnCounter = onCounter;
    *newOffCounter = offCounter;
	
    return currentState;
}

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

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

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

相关文章

【MAC】深入浅出 Homebrew 下 Nginx 的安装与配置指南

硬件:Apple M4 Pro 16寸 系统: macos Sonoma 15.1.1 Nginx 是一款高性能的 Web 服务器和反向代理服务器,广泛应用于全球各地的网站和企业应用中。本文将详细介绍如何在 macOS 环境下使用 Homebrew 安装、启动、管理以及优化配置 Nginx&#x…

flutter --no-color pub get 超时解决方法

新建Flutter项目后,运行报错,需要执行pub get 点击Run ‘flutter pub get’ … … … 卡着,不动了,提示超时 是因为墙的问题 解决方案: 添加以下环境变量 变量名: PUB_HOSTED_URL 变量值: https://pub.flutter-io.cn …

【题解】【枚举】——[NOIP2018 普及组] 龙虎斗

【题解】【枚举】——[NOIP2018 普及组] 龙虎斗 [NOIP2018 普及组] 龙虎斗题目背景题目描述输入格式输出格式输入输出样例输入 #1输出 #1输入 #2输出 #2 提示 1.思路解析2.AC代码 [NOIP2018 普及组] 龙虎斗 通往洛谷的传送门 题目背景 NOIP2018 普及组 T2 题目描述 轩轩和…

记录仪方案_记录仪安卓主板定制_音视频记录仪PCBA定制开发

记录仪主板采用了强大的联发科MTK8768处理器,拥有出色的性能表现。它搭载了四个主频为2.0GHz的Cortex-A53核心与四个主频为1.5GHz的Cortex-A53核心,确保了高效的处理速度。此外,主板配备了4GB的RAM(可选8GB),并且内置64GB的ROM(可…

数据集-目标检测系列 车牌检测识别 数据集 CCPD2019

车牌检测&识别 数据集 CCPD2019 DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集,持续增加中。 需要更多数据资源和技术解决方案,知识星球: “DataBall - X 数据球(free)” 贵在坚持! 数据样…

Eclipse设置自动补全后 输入字符串类型变量后会自动追加String的解决方案

很简单,先打开eclipse,顶部找到window,点击preference 弹出一个设置窗口; 在窗口左侧选择Java>Editor>Content Assist;然后再右侧找到Disable insertion triggers except Enter 的选项(禁用除Enter以…

uniApp上传文件踩坑日记

最近在做移动端app,开始接触uniapp。想着直接用PC端的前后端API去做文件上传,但是uniapp的底层把请求拆成了普通请求和文件上传请求,所以不能用一个axios去做所有请求的处理,拆成uni.request和uni.uploadFile去分别处理两种情况。…

Qt Quick:CheckBox 复选框

复选框不止选中和未选中2种状态哦,它还有1种部分选中的状态。这3种状态都是Qt自带的,如果想让复选框有部分选中这个状态,需要将三态属性(tristate)设为true。 未选中的状态值为0,部分选中是1,选…

Pytorch | 从零构建GoogleNet对CIFAR10进行分类

Pytorch | 从零构建GoogleNet对CIFAR10进行分类 CIFAR10数据集GoogleNet网络结构特点网络整体架构应用与影响Inceptionv1到Inceptionv2 GoogleNet结构代码详解结构代码代码详解Inception 类初始化方法前向传播 forward GoogleNet 类初始化方法前向传播 forward 训练过程和测试结…

PCIe_Host驱动分析_地址映射

往期内容 本文章相关专栏往期内容,PCI/PCIe子系统专栏: 嵌入式系统的内存访问和总线通信机制解析、PCI/PCIe引入 深入解析非桥PCI设备的访问和配置方法 PCI桥设备的访问方法、软件角度讲解PCIe设备的硬件结构 深入解析PCIe设备事务层与配置过程 PCIe的三…

jenkins 出现 Jenkins: 403 No valid crumb was included in the request

文章目录 前言解决方式:1.跨站请求为找保护勾选"代理兼容"2.全局变量或者节点上添加环境变量3.(可选)下载插件 the strict Crumb Issuer plugin4.重启 前言 jenkins运行时间长了,经常出现点了好几次才能构建,然后报了Je…

CentOS 7 安装、测试和部署FastDFS

目录 FastDFS环境搭建 安装 libfastcommon 库 安装FastDFS 查看编译后的文件 FastDFS配置 FastDFS启动 启动tracker服务 启动storage服务 查看storage是否已经注册到了tracker下 查看存储文件的目录 FastDFS重启 FastDFS关闭 使用fdfs_test进行测试 修改client.co…

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

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

Flutter组件————FloatingActionButton

FloatingActionButton 是Flutter中的一个组件,通常用于显示一个圆形的按钮,它悬浮在内容之上,旨在吸引用户的注意力,并代表屏幕上的主要动作。这种按钮是Material Design的一部分,通常放置在页面的右下角,但…

在Windows11上编译C#的实现Mono的步骤

在Windows11上编译Mono的步骤 1、 在win11打开开发者模式,在更新和安全选项里,如下图: 2、下载并安装64位的cygwin, 下载网站:www.cygwin.com 3、 安装 Visual Studio 2015 or later 的社区版本。 4、 下载Mono的windows最新版本。 5、 在cmd.exe里运行下面的命令来安…

[HNCTF 2022 Week1]你想学密码吗?

下载附件用记事本打开 把这些代码放在pytho中 # encode utf-8 # python3 # pycryptodemo 3.12.0import Crypto.PublicKey as pk from hashlib import md5 from functools import reducea sum([len(str(i)) for i in pk.__dict__]) funcs list(pk.__dict__.keys()) b reduc…

【记录50】uniapp安装uview插件,样式引入失败分析及解决

SassError: Undefined variable: "$u-border-color". 表示样式变量$u-border-color没定义&#xff0c;实际是定义的 首先确保安装了scss/sass 其次&#xff0c;根目录下 app.vue中是否全局引入 <style lang"scss">import /uni_modules/uview-ui/in…

如何写申请essay

俗话说&#xff1a;万事开头难。英国留学申请essay也是如此。申请essay怎么写呢&#xff1f;一篇essay的开头是否精彩直接关系到导师能否被你的文字吸引。一把而言&#xff0c;招生官每天阅读的essay在200封以上&#xff0c;每篇阅读在12分钟以内&#xff0c;所以你的essay开头…

14-zookeeper环境搭建

0、环境 java&#xff1a;1.8zookeeper&#xff1a;3.5.6 1、下载 zookeeper下载点击这里。 2、安装 下载完成后解压&#xff0c;放到你想放的目录里。先看一下zookeeper的目录结构&#xff0c;如下图&#xff1a; 进入conf目录&#xff0c;复制zoo_sample.cfg&#xff0…

【UE5】pmx导入UE5,套动作。(防止“气球人”现象。

参考视频&#xff1a;UE5Animation 16: MMD模型與動作導入 (繁中自動字幕) 问题所在&#xff1a; 做法记录&#xff08;自用&#xff09; 1.导入pmx&#xff0c;删除这两个。 2.转换给blender&#xff0c;清理节点。 3.导出时&#xff0c;内嵌贴图&#xff0c;选“复制”。 …