打印

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

[复制链接]
1399|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

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

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

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

unsigned char dat2=dat;

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


#include <stdio.h>

unsigned char count;

void test(unsigned char dat)
{
        while(dat--)
        {
                printf("dat=0x%X\n", dat);
        }
}

int main(void)
{
        count=8;
        test(count);
        printf("count=0x%X\n", count);
}



微信图片_20240812082550.png (51.55 KB )

微信图片_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;”这个真没必要。。。

使用特权

评论回复
5
dw772| | 2024-8-12 11:07 | 只看该作者
本帖最后由 dw772 于 2024-8-12 13:29 编辑

你这个dat就是形参,不是你理解的dat就是count,count才是实参,count从函数运行到结束都没有变化啊。你可以print   dat同时print   count对比一下就知道了

使用特权

评论回复
6
春风路过| | 2024-8-12 15:58 | 只看该作者
本帖最后由 春风路过 于 2024-8-12 16:51 编辑

不错很不错

使用特权

评论回复
7
春风路过| | 2024-8-12 16:03 | 只看该作者
本帖最后由 春风路过 于 2024-8-12 16:52 编辑

说起来话长。

使用特权

评论回复
8
春风路过| | 2024-8-12 16:07 | 只看该作者
本帖最后由 春风路过 于 2024-8-12 17:35 编辑

在我的职业生涯中,遇到无数这种不按常理出牌而沾沾自喜的人。这和中国人的思维习惯有关系,喜欢考试和标准答案。

使用特权

评论回复
9
春风路过| | 2024-8-12 16:11 | 只看该作者
还有人问,既然二极管是一个PN结,三极管两个PN结,那我用两个二极管是不是可以组成一个三极管?让人差点笑岔气。

使用特权

评论回复
评论
xch 2024-8-12 16:48 回复TA
还真得可以。但是中间别串联一根金属丝 
10
xiaofei558008| | 2024-8-12 17:58 | 只看该作者
misra-c  貌似不允许
https://www.stroustrup.com/JSF-AV-rules.pdf

使用特权

评论回复
11
gaoyang9992006| | 2024-8-12 21:52 | 只看该作者
可以这么操作,实参也是该函数的局部变量。

使用特权

评论回复
12
panxiaoyi|  楼主 | 2024-8-12 22:35 | 只看该作者
多谢大家热心的解答,大家的解答是正确的,正如下面的文摘:

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

一、主体不同

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

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

二、目的不同

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

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

三、特点不同

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

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


使用特权

评论回复
13
panxiaoyi|  楼主 | 2024-8-12 22:42 | 只看该作者
21IC.com 和以前的 amobbs,都让我学习到了非常非常多的知识,在这里诚心的说声感谢。也希望论坛的友好气氛能够持久下去

使用特权

评论回复
14
丙丁先生| | 2024-8-13 08:39 | 只看该作者
对于基本数据类型的实参,函数内改变实参是不合法的,因为函数内部的修改不会影响到实际参数的值。而对于指针类型的实参,函数内改变实参是合法的,因为函数内部的修改会影响到实际参数所指向的内存地址的值。

使用特权

评论回复
15
丙丁先生| | 2024-8-13 08:44 | 只看该作者
这段代码中,函数`test`的参数`dat`是通过值传递的方式传入的。在函数内部,对`dat`进行递减操作并不会影响外部变量`count`的值。因此,当程序执行完毕后,输出的结果将是:

```
dat=0x7
dat=0x6
dat=0x5
dat=0x4
dat=0x3
dat=0x2
dat=0x1
dat=0x0
count=0x8
```

使用特权

评论回复
16
handlike| | 2024-8-13 09:20 | 只看该作者
"对于基本数据类型的实参,函数内改变实参是不合法的"
这就是往往再引入再定义一个变量的原因(unsigned char dat2=dat;)

使用特权

评论回复
17
xionghaoyun| | 2024-8-13 10:30 | 只看该作者
dat是局部变量 用完就释放了

使用特权

评论回复
18
海洋无限| | 2024-8-13 12:10 | 只看该作者
这个操作肯定没问题,只要能符合你的逻辑要求就行

使用特权

评论回复
19
zlf1208| | 2024-8-13 12:54 | 只看该作者
搞清楚函数调用时传值和传指针的区别

使用特权

评论回复
20
qintian0303| | 2024-8-13 15:53 | 只看该作者
合不合法直接编译就好了,不报警大概率没有问题,经常这样做啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

50

主题

397

帖子

2

粉丝