panxiaoyi 发表于 2024-8-12 08:28

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


大家好,请教一下,单片机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);
}



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结,那我用两个二极管是不是可以组成一个三极管?让人差点笑岔气。

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,都让我学习到了非常非常多的知识,在这里诚心的说声感谢。也希望论坛的友好气氛能够持久下去

丙丁先生 发表于 2024-8-13 08:39

对于基本数据类型的实参,函数内改变实参是不合法的,因为函数内部的修改不会影响到实际参数的值。而对于指针类型的实参,函数内改变实参是合法的,因为函数内部的修改会影响到实际参数所指向的内存地址的值。

丙丁先生 发表于 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
```

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

合不合法直接编译就好了,不报警大概率没有问题,经常这样做啊
页: [1] 2
查看完整版本: 单片机C语言,请问函数内改变实参是否合法?