求C语言大神解答。以下几两个结果为什么不一样。有什么区别。

1.
#include<stdio.h>
#include<string.h>
typedef struct stu
{
char name[10];
char gender;
int score;
}STU;
void f(char name[10],char gender,int score)
{
strcpy(name,"Sun");
gender='m';
score=370;
}
main()
{
STU b={"Zhao",'m',290},a={"Qian",'T',390};
b=a;
printf("%s,%c,%d,",b.name,b.gender,b.score);
f(b.name,b.gender,b.score);
printf("%s,%c,%d\n",b.name,b.gender,b.score);
}
2.
#include<stdio.h>
#include<string.h>
struct A
{
int a;char b[10];double c;
};
void f(struct A t);
main()
{
struct A a={1001,"ZhangDa",1098.0};
f(a);
printf("%d,%s,%6.1f\n",a.a,a.b,a.c);
}
void f(struct A t)
{t.a=1002;strcpy(t.b,"ChangRong");t.c=1202.0;
}
最新回答
生活不易靠演技

2024-11-29 10:48:10

第一个程序运行结果如下图:

第二个程序运行结果如下图:

第一个程序的b.name和第二个程序的结构体t的数据全部改变的原因是,

他们传递的是指针(数据地址),子函数形参指向同一段内存,

故子函数对变量的操作反应在主函数中。

而第一个程序的b.gender和b.score是两个变量,只能通过压栈的方式传入,

此时子函数形参使用单独的一片内存,子函数结束后释放,

并不能映射回主函数,除非用renturn来返回结果。

可尝试把而第一个程序的b.gender和b.score用指针(地址)传递,

此时子函数对两个变量的操作会体现在主函数中。

追问
第二个中调用了f(a),为何输出对输出结果没影响,就是输出1001,ZhangDa,1098.0,而且其中含有strcpy这个函数。而第一个也是调用了f函数,也含有strcpy这个函数,然后输出就只变了b.name。
追答
这个问题就是参数用变量传递和用指针传递的区别的问题,

用变量传递,则处理的是一个映射值,
用指针传递,则处理的是传递的原值。
这个直接用内存监视工具,监视主函数的对应的struct的内存地址即可分辨清楚。
追问
好的,谢谢。
追答
不必客气。
何必讨好

2024-11-29 19:14:23

具体点,不知道你啥意思
追问
就是1中第二个输出是Sun,T,390,就是b,name变了,而其他两个没变。而在2中,三个都没变。