#include "stdio.h"
struct student
{
int x;
char c;
}a;
void f1(struct student b);
void f2(struct student *b);
void main(void)
{
a.x=3;
a.c='a';
f1(a);
printf("%d,%c\n", a.x, a.c);
f2(&a);
printf("%d,%c\n", a.x, a.c);
}
void f1(struct student b)
{
b.x=20;
b.c='y';
}
void f2(struct student *b)
{
b->x = 20;
b->c = 'y';
}
/*1.为什么结构体变量作形参时,其成员的值不会变?这是因为在函数调用中,
值的传递是单向的。就拿本题说,在f1函数中,系统为b.x和b.c在内存的动
态存储区中开辟了临时的存储区(但开辟的地址和a.x和a.c的地址不同),
函数调用完成后b.x和b.c的存储区即被释放。由于值的传递是单向的。所以
,b.x和b.c的值的改变并未引起a.x和a.c的改变。当程序执行完毕后,a.x
和a.c所占用的内存才被释放。
2.为什么结构体变量的地址作形参时,其成员的值会
变? 拿本题说,你把这个地址传给形参后,你在执行函数时f2时,你相当于直接进
入了a.x和a.c在内存中的区域,所以你的操作就是直接在修改a.x和a.c的值。
总结:简单而言,第一种传递方式就相当于在另外的内存地址中改变了实参传递
给形参的值。但这种改变由于值的单向传递未能传递到实参的地址中。而第二种方式中
,就相当于你直接进入了实参所在的内存地址中,你改变了地址中的值,所以实参的值自
然改变啦!*/