鱼C论坛

 找回密码
 立即注册
查看: 1134|回复: 12

[已解决]求大佬解析一下这题

[复制链接]
发表于 2020-8-13 18:02:09 | 显示全部楼层 |阅读模式
20鱼币
#include <stdio.h>
typedef struct {int b, p;}A;
void f(A c)//注意: C是结构变量名
{
        int j;
        c.b += 1; c.p += 2;
}
main()
{
        int i;
        A a ={1,2};
        f(a);
        printf("%d, %d\n", a.b, a.p);
}
最佳答案
2020-8-13 18:02:10
你不理解的或许是形参实参,局部变量的问题
帮你对程序进行了注释,希望能帮到你
  1. #include <stdio.h>
  2. typedef struct {int b, p;}A;//声明了一个结构体类型A,A类型有两个int类型变量,分别是b和p
  3. void f(A c)//注意: C是结构变量名
  4. {//c为形参,是一个局部变量,函数调用结束,c会被立即销毁
  5.     int j;
  6.     c.b += 1; c.p += 2;//c.b自加1,c.p自加2
  7. }
  8. int main()
  9. {
  10.     int i;
  11.     A a ={1,2};//定义了结构体变量a,a.b=1,a.p=2
  12.     f(a);//调用函数f,a作为实参传进函数。然而函数的运行没有对a产生任何影响
  13.     printf("%d, %d\n", a.b, a.p);//输出a.b和a.p
  14. }
复制代码

最佳答案

查看完整内容

你不理解的或许是形参实参,局部变量的问题 帮你对程序进行了注释,希望能帮到你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-13 18:02:10 | 显示全部楼层    本楼为最佳答案   
你不理解的或许是形参实参,局部变量的问题
帮你对程序进行了注释,希望能帮到你
  1. #include <stdio.h>
  2. typedef struct {int b, p;}A;//声明了一个结构体类型A,A类型有两个int类型变量,分别是b和p
  3. void f(A c)//注意: C是结构变量名
  4. {//c为形参,是一个局部变量,函数调用结束,c会被立即销毁
  5.     int j;
  6.     c.b += 1; c.p += 2;//c.b自加1,c.p自加2
  7. }
  8. int main()
  9. {
  10.     int i;
  11.     A a ={1,2};//定义了结构体变量a,a.b=1,a.p=2
  12.     f(a);//调用函数f,a作为实参传进函数。然而函数的运行没有对a产生任何影响
  13.     printf("%d, %d\n", a.b, a.p);//输出a.b和a.p
  14. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-13 18:04:01 | 显示全部楼层
我一点都看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-13 18:12:12 | 显示全部楼层
一开始可以看出typedef struct是定义了一个结构体,A是一个结构体的类名(这个可能说的不太准确),里边包含了两个变量,即b和p。
然后主函数中,定义了一个A类型的变量a,其中a.b=1,a.p=2;
然后执行f(a)跳转到函数中(此时,只是把形参传过去了,即令c=a,但是c不是a),修改了c.b和c.p,他们的值分别为2,4(这可你可以加一句  printf("%d, %d\n", c.b, c.p);就知道了)
因为上一步传的是形参,真正的值没有返回到a中,所以输出的仍然是a原本的值:a.b=1,a.p=2;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-13 18:14:14 | 显示全部楼层

看不懂啥
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-13 18:20:46 | 显示全部楼层
Heyyyyyyy 发表于 2020-8-13 18:12
一开始可以看出typedef struct是定义了一个结构体,A是一个结构体的类名(这个可能说的不太准确),里边包 ...

那, 我不太清除, 为什么参数传到, f函数中, c会是a呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-13 18:24:02 | 显示全部楼层
sunrise085 发表于 2020-8-13 18:16
你不理解的或许是形参实参,局部变量的问题
帮你对程序进行了注释,希望能帮到你

主函数中f(a)为什么传给c呢, 而不给A
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-13 18:27:21 | 显示全部楼层
脑海里 发表于 2020-8-13 18:20
那, 我不太清除, 为什么参数传到, f函数中, c会是a呢

因为在函数f中c是自己占了一个内存空间的,而a作为一个独立的变量也是自己占了一个内存空间的,他们占着各自的内存空间,所以无法改变对方的值,如果你用指针,就可以改变他们的值,例如下边的代码:
  1. #include <stdio.h>
  2. typedef struct {int b, p;}A;
  3. void f(A *c)//注意: C是结构变量名
  4. {
  5.         int j;
  6.         c->b += 1; c->p += 2;
  7. }
  8. main()
  9. {
  10.         int i;
  11.         A a ={1,2};
  12.         f(&a);
  13.         printf("%d, %d\n", a.b, a.p);
  14. }
复制代码

因为这时候c是一个指针,指向了a所占的内存空间,故修改的也是a的值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-13 18:34:40 | 显示全部楼层
脑海里 发表于 2020-8-13 18:20
那, 我不太清除, 为什么参数传到, f函数中, c会是a呢

举个例子:超市做活动,发出一些传单,对外宣布,凡是持此宣传单的本超市会员可到店给自己的会员卡积分翻倍。
这里传单就相当于函数f;
超市会员相当于c。小明是超市会员,相当于a;
小明的会员积分为100,相当于a.b为1,a.p为2;
小明手持宣传单进入超市,相当于传参进函数。

但实际上你的这个函数是值传递方式,相当于小明进入超市兑换积分,仅仅是让小明拿着会员积分值去了超市,然后在纸上写积分翻倍,实际上小明的积分卡上积分没变。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-13 18:35:13 | 显示全部楼层
脑海里 发表于 2020-8-13 18:20
那, 我不太清除, 为什么参数传到, f函数中, c会是a呢

我刚来等级好像还不够,还加不了好友,抱歉啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-13 18:36:36 | 显示全部楼层
脑海里 发表于 2020-8-13 18:24
主函数中f(a)为什么传给c呢, 而不给A


A是个数据类型。类似于int、char、float等等,只是这个类型是你自己定义的
c才是该类型的变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-13 18:38:53 | 显示全部楼层
Heyyyyyyy 发表于 2020-8-13 18:35
我刚来等级好像还不够,还加不了好友,抱歉啦

没事. 想加你好友问问, 问题已解决, 谢谢啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-13 18:44:32 | 显示全部楼层
sunrise085 发表于 2020-8-13 18:34
举个例子:超市做活动,发出一些传单,对外宣布,凡是持此宣传单的本超市会员可到店给自己的会员卡积分翻 ...

OK ,谢谢, 懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-24 13:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表