脑海里 发表于 2020-8-13 18:02:09

求大佬解析一下这题

#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);
}

sunrise085 发表于 2020-8-13 18:02:10

你不理解的或许是形参实参,局部变量的问题
帮你对程序进行了注释,希望能帮到你
#include <stdio.h>
typedef struct {int b, p;}A;//声明了一个结构体类型A,A类型有两个int类型变量,分别是b和p
void f(A c)//注意: C是结构变量名
{//c为形参,是一个局部变量,函数调用结束,c会被立即销毁
    int j;
    c.b += 1; c.p += 2;//c.b自加1,c.p自加2
}
int main()
{
    int i;
    A a ={1,2};//定义了结构体变量a,a.b=1,a.p=2
    f(a);//调用函数f,a作为实参传进函数。然而函数的运行没有对a产生任何影响
    printf("%d, %d\n", a.b, a.p);//输出a.b和a.p
}

脑海里 发表于 2020-8-13 18:04:01

我一点都看不懂{:10_266:}

Heyyyyyyy 发表于 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;

永恒的蓝色梦想 发表于 2020-8-13 18:14:14

脑海里 发表于 2020-8-13 18:04
我一点都看不懂

看不懂啥

脑海里 发表于 2020-8-13 18:20:46

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

那, 我不太清除, 为什么参数传到, f函数中, c会是a呢

脑海里 发表于 2020-8-13 18:24:02

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

主函数中f(a)为什么传给c呢, 而不给A

Heyyyyyyy 发表于 2020-8-13 18:27:21

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

因为在函数f中c是自己占了一个内存空间的,而a作为一个独立的变量也是自己占了一个内存空间的,他们占着各自的内存空间,所以无法改变对方的值,如果你用指针,就可以改变他们的值,例如下边的代码:
#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);
}
因为这时候c是一个指针,指向了a所占的内存空间,故修改的也是a的值

sunrise085 发表于 2020-8-13 18:34:40

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

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

但实际上你的这个函数是值传递方式,相当于小明进入超市兑换积分,仅仅是让小明拿着会员积分值去了超市,然后在纸上写积分翻倍,实际上小明的积分卡上积分没变。

Heyyyyyyy 发表于 2020-8-13 18:35:13

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

我刚来等级好像还不够,还加不了好友,抱歉啦{:10_285:}

sunrise085 发表于 2020-8-13 18:36:36

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

A是个数据类型。类似于int、char、float等等,只是这个类型是你自己定义的
c才是该类型的变量

脑海里 发表于 2020-8-13 18:38:53

Heyyyyyyy 发表于 2020-8-13 18:35
我刚来等级好像还不够,还加不了好友,抱歉啦

没事. 想加你好友问问, 问题已解决, 谢谢啦

脑海里 发表于 2020-8-13 18:44:32

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

OK ,谢谢, 懂了
页: [1]
查看完整版本: 求大佬解析一下这题