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

目录

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

函数指针参数传递用法


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

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

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

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

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

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

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

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

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

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

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

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

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

形象对比

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

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

函数指针参数传递用法

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

cpp 复制代码
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语句,将结构体返回出去,同时在函数外,将结构体变量的值赋值给传入函数的实参,或者直接在函数中,调用实参指针,进行赋值。

cpp 复制代码
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;
}

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