单片机C语言,请问函数内改变实参是否合法?

[复制链接]
 楼主| panxiaoyi 发表于 2024-8-12 08:28 | 显示全部楼层 |阅读模式

大家好,请教一下,单片机C语言,请问函数内改变实参是否合法?

代码和运行结果如下图,运行结果是正确的,都说函数内是无法更改实参的,但是这个运行结果,却显示,在函数内,实参已经发生了变化,当然,函数结束后,实参还是没有变化。

请教一下,像这种语法,是否合法?是否要在函数内定义一个变量:

unsigned char dat2=dat;

然后在函数内操作 dat2,这样才更稳妥?或者说定义 dat2 完全是画蛇添足?


  1. #include <stdio.h>

  2. unsigned char count;

  3. void test(unsigned char dat)
  4. {
  5.         while(dat--)
  6.         {
  7.                 printf("dat=0x%X\n", dat);
  8.         }
  9. }

  10. int main(void)
  11. {
  12.         count=8;
  13.         test(count);
  14.         printf("count=0x%X\n", count);
  15. }



微信图片_20240812082550.png
 楼主| panxiaoyi 发表于 2024-8-12 08:30 | 显示全部楼层
我在网上查询 CRC 校验代码时,发现很多都是这样的,都是直接更改实参的,因此想请教一下
LcwSwust 发表于 2024-8-12 09:36 | 显示全部楼层
本帖最后由 LcwSwust 于 2024-8-12 09:42 编辑

可以啊,形参相当于函数内部的局部变量,调用函数时就给这局部变量赋值.
zhuls 发表于 2024-8-12 11:06 | 显示全部楼层
本帖最后由 zhuls 于 2024-8-12 11:09 编辑

可以的啊
而“unsigned char dat2=dat;”这个真没必要。。。

dw772 发表于 2024-8-12 11:07 | 显示全部楼层
本帖最后由 dw772 于 2024-8-12 13:29 编辑

你这个dat就是形参,不是你理解的dat就是count,count才是实参,count从函数运行到结束都没有变化啊。你可以print   dat同时print   count对比一下就知道了
春风路过 发表于 2024-8-12 15:58 | 显示全部楼层
本帖最后由 春风路过 于 2024-8-12 16:51 编辑

不错很不错
春风路过 发表于 2024-8-12 16:03 | 显示全部楼层
本帖最后由 春风路过 于 2024-8-12 16:52 编辑

说起来话长。
春风路过 发表于 2024-8-12 16:07 | 显示全部楼层
本帖最后由 春风路过 于 2024-8-12 17:35 编辑

在我的职业生涯中,遇到无数这种不按常理出牌而沾沾自喜的人。这和中国人的思维习惯有关系,喜欢考试和标准答案。
春风路过 发表于 2024-8-12 16:11 | 显示全部楼层
还有人问,既然二极管是一个PN结,三极管两个PN结,那我用两个二极管是不是可以组成一个三极管?让人差点笑岔气。

评论

xch
还真得可以。但是中间别串联一根金属丝  发表于 2024-8-12 16:48
xiaofei558008 发表于 2024-8-12 17:58 | 显示全部楼层
misra-c  貌似不允许
https://www.stroustrup.com/JSF-AV-rules.pdf
gaoyang9992006 发表于 2024-8-12 21:52 | 显示全部楼层
可以这么操作,实参也是该函数的局部变量。
 楼主| panxiaoyi 发表于 2024-8-12 22:35 | 显示全部楼层
多谢大家热心的解答,大家的解答是正确的,正如下面的文摘:

通过形参与实参在函数中位置来进行区分,两者区别如下:

一、主体不同

1、实参:在调用有参函数时,函数名后面括号中的参数为“实际参数”。

2、形参:不是实际存在变量,又称虚拟变量。

二、目的不同

1、实参:可以是常量、变量或表达式, 无论实参是何种类型的量,在进行函数调用时,都必须具有确定的值, 以便把这些值传送给形参。

2、形参:定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数。

三、特点不同

1、实参:在调用函数过程中,系统会把实参的值传递给被调用函数的形参。或者说,形参从实参得到一个值。该值在函数调用期间有效,可以参加该函数中的运算。

2、形参:形参的本质是一个名字,不占用内存空间。


 楼主| panxiaoyi 发表于 2024-8-12 22:42 | 显示全部楼层
21IC.com 和以前的 amobbs,都让我学习到了非常非常多的知识,在这里诚心的说声感谢。也希望论坛的友好气氛能够持久下去
handlike 发表于 2024-8-13 09:20 | 显示全部楼层
"对于基本数据类型的实参,函数内改变实参是不合法的"
这就是往往再引入再定义一个变量的原因(unsigned char dat2=dat;)
xionghaoyun 发表于 2024-8-13 10:30 | 显示全部楼层
dat是局部变量 用完就释放了
海洋无限 发表于 2024-8-13 12:10 | 显示全部楼层
这个操作肯定没问题,只要能符合你的逻辑要求就行
zlf1208 发表于 2024-8-13 12:54 | 显示全部楼层
搞清楚函数调用时传值和传指针的区别
qintian0303 发表于 2024-8-13 15:53 | 显示全部楼层
合不合法直接编译就好了,不报警大概率没有问题,经常这样做啊
qintian0303 发表于 2024-8-13 15:56 | 显示全部楼层
你调用这个函数后实际上就是把实参给到了形参,打印的也是形参,当让实参不变了
 楼主| panxiaoyi 发表于 2024-8-14 22:22 | 显示全部楼层


应该说,是我描述的不够详细。

我的目的是想在函数内做有限次数的循环,我也知道函数从始到终都不会改变 count 的值,也不想改变这个值。只是当时不知道这个 count 与 dat 的关系。

我当时只是想:在函数内,如果能够利用 “dat” ,就没有必要定义 “dat2”。如果不能利用 “dat”,或者利用 “dat” 有违背 C 规则,就乖乖的定义多一个“dat2=dat”。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

53

主题

414

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部