C语言问题

有一程序#include<stdio.h>#include<string.h>typedefstruct{charname[9];charsex;floatscore[2... 有一程序
#include<stdio.h>
#include<string.h>
typedef struct {char name [9];char sex; float score [2];} STU;
STU f(STU a)
{STU b={"zhao",'m',85.0,90.0}; int i;
strcpy(a.name,b.name);
a.sex=b.sex;
for(i=0;i<2;i++) a.score[i]=b.score[i];
return a;
}
main()
{STU c={"Qian",'f',95.0,92.0},d;
d=f(c);printf("%s,%c,%2.0f,%2.0f\n" , d.name , d.sex , d.score[0] , d.score[1];}

程序的运行结果是
A) Qian,f,95,92 B) zhao,m,85,90
答案是B
问: 答案解析上说 函数f的功能是将结构体变量b的值赋给结构体变量a,并返回结构体变量a,因此在主程序中,执行语句d=f(c);后,结构体变量d的值等于函数f中结构体变量b的值,因此选B

可是在调用函数中 ,传递给形参的只是普通的结构体变量,系统又开辟了一段给a的存储空间,返回值给d后,a所在的存储空间不就没了吗? d的值不就不存在了吗? 为什么d的值不是原来c的值 而是 函数中操作后的值呢?
运行程序后,c中的值变了没有??
不是说 在被调用函数中,不可能改变调用函数中变量的值么???
展开
 我来答
FrankHB1989
2012-02-29 · TA获得超过4.2万个赞
知道大有可为答主
回答量:4569
采纳率:100%
帮助的人:3123万
展开全部
关键是不同于Java/C#,C/C++在这里是完全体现值语义,即函数返回一个对象类型的值时复制了return的值作为函数调用表达式的值。因此尽管f(c)和a不是同一个对象(严格意义上说,编译器可以把f(c)和a实现为在同一存储空间中避免直接的复制导致实际上是同一片存储,但从语言上来说f(c)是非左值对象,无法使用&来得到确定的存储,因此逻辑上两者不是相同的对象),这个复制行为保证这里f(c)的值就是a的值——注意是值而不是左值,无法用&等作为对象来访问,语言保证你可以不必关心这个值存储在哪或者有没有超出对象的生存期——d=f(c)的效果就是把a的值赋值给d。
@SUNNY_Z_S_H胡扯,C的数组能转换为指向首个元素的指针,结构体没这个功能。C语言中函数只能按值传递(注意被传递的指针类型的对象本身仍然具有一个值;和返回值类似,这里也发生复制,只不过形参和实参本身都可以是左值并且显然不是同一个对象,所以有必要互相区分)。倒是文曲星上用的Lava语言(没有指针类型)中结构体表示对象所在的首个地址。

参考资料: 原创

SUNNY_Z_S_H
2012-02-29 · 超过11用户采纳过TA的回答
知道答主
回答量:55
采纳率:0%
帮助的人:28.3万
展开全部
首先说结构体名代表结构体的首地址 调用f(c)用b把c重新初始化此时c就是b了 d=f(c)把c的首地址返回给d 所以d指向被重新附值的c 可以看出函数f是地址传递 所以…
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
22流星雨21
2012-03-02
知道答主
回答量:96
采纳率:0%
帮助的人:19.6万
展开全部
“结构体是”类似“指针”都是指向地址的,所以能变的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
南通太极菲林打印机
2012-02-29 · 贡献了超过152个回答
知道答主
回答量:152
采纳率:0%
帮助的人:44.8万
展开全部
当然可能
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式