目录
为什么有指针参数传递这种用法
函数指针参数传递用法
编写不易,仅供学习,请勿搬运,感谢理解
嵌入式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;
}
欢迎指正,希望对你,有所帮助!!!