c语言:这题的c语言解题思路路是怎样的,为什么结果是那样的?

C语言问题,在这题里值是怎么传递的?_百度知道
C语言问题,在这题里值是怎么传递的?
有以下程序#include #include typedef struct{ char name[9]; float score[2]; } STU;STU f(STU a){ STU b={&Zhao&,'m',85.0,90.0};strcpy(a.name,b.name);a. sex=b.for(i=0;i&2;i++) a.score=b.}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]);}程序的运行结果是
提问者采纳
Zhao,m,85.0,90.0 f会对参数a进行从新赋值 ,把b拷贝到a上。a返回时在拷贝到d上。所以d的结果和b一样
拷贝的部分不是只有这个?strcpy(a.name,b.name)没有用这个函数的,在没有指针的情况下也烤得过来?
结构可以直接赋值,是内存拷贝。这样做如果有指针就有麻烦,因为指针会指向同一个地址,而不是新的一个空间,有指针就要写拷贝函数,自己申请指针,你的这个结构都是定长数据。赋值即可。
提问者评价
谢谢你的耐心解答,好详细呀
其他类似问题
参数传递分两种:值传递与引用传递,而在C语言标准里是没有引用传递的,通常程序员会采用传递变量指针值的方式来模拟引用传递。你这里的函数调用是指传递,并非指针模拟引用传递,更不是引用传递;输出结果: Zhao,m,85,90,因为d接收了函数f的返回值,也就是存放zhao信息的结构体。
值传递?话说这个改变掉的值传得回来?不好意思,我是小白~~~
值传递的精髓就是实参的拷贝,所以,你这里d=f(c),在f被调用之前,首先会将你的结构体变量c进行拷贝,然后将a与拷贝后的变量进行关联,以便于在f函数内部可以通过变量名a来访问拷贝的变量的内存空间。这个就是所谓的值传递。在函数f中,给拷贝的变量重新赋值,然后将其结果传递回主函数,赋值给d,这里一句执行的过程也是一个拷贝,首先将a的值拷贝,然后将其赋值给d,返回后,a的内存空间会被释放。
为您推荐:
c语言的相关知识
其他3条回答
是指针的传递,不是值,就是将对象的首地址传递到函数。
结构体这种是按值传递的。
程序结果是 zhao
通过结构体指针把值传递过去的
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁下面这个程序,使用bnarySearch二分查找函数做查找操作,发现程序运行到那里会崩溃;在找崩溃位置的时候,神奇的发现,加一个打印语句居然就可以用了,为什么呢?&div class=&highlight&&&pre&&code class=&language-text&&int main(){
listtype *l=&
int a[]={51,38,79,22,91,105,33,52,16,112};
initiate_list(l);
addAll_list(l,a,(sizeof(a)/sizeof(int)));
output(l);
printf(&%d\n&,binarySearch(l,22));
int binarySearch(listtype *l,int x){//二分查找
int low,high,
low=0;//区域下限
high=length_list(l)-1;//区域上限
printf(& &);//没有这一句就会崩溃,把‘ ’改成‘’一样崩溃!!!
while(low&=high){
mid=(mid+high)/2;//区域中间位置
if(l-&data[mid]==x)//x等于mid元素则返回
return(mid+1);
else if(l-&data[mid]&x)//不等于mid元素则改变域
low=mid+1;
high=mid-1;
return(false);
&/code&&/pre&&/div&
下面这个程序,使用bnarySearch二分查找函数做查找操作,发现程序运行到那里会崩溃;在找崩溃位置的时候,神奇的发现,加一个打印语句居然就可以用了,为什么呢?int main(){
listtype *l=&
int a[]={51,38,79,22,91,105,33,52,16,112};
initiate_list(l);
addAll_list(l,a,(sizeof(a)/sizeof(int)));
output(l);
printf("%d\n",binarySearch(l,22));
int binarySearch(listtype *l,int x){//二分查找
int low,high,
low=0;//区域下限
high=length_list(l)-1;//区域上限
printf(" ");//没有这一句就会崩溃,把‘ ’改成‘’一样崩溃!!!
while(low&=high){
mid=(mid+high)/2;//区域中间位置
if(l-&data[mid]==x)//x等于mid元素则返回
return(mid+1);
else if(l-&data[mid]&x)//不等于mid元素则改变域
low=mid+1;
high=mid-1;
return(false);
我记得编程珠玑上专门有一章讲二分查找的,还有the c programming language 上面也给了一个二分查找的程序。
谢邀,但是你的listtype我看不见,我不确定是否是相关方法的问题,你最好都放上来,另外我知道你的二分查找的算法有错:mid = (mid + high) / 2应该为 mid = (low + high) / 2另外,你的数组有排序吗?不排序不能二分查找经过 童鞋的提醒,mid = low + (high - low) / 2会是更好的做法,因为若high过高的话,mid = (low + high) / 2的写法会溢出。
区域中间位置有问题,mid = (mid + high) / 2应该为 mid = (low + high) / 2,具体可查看
的答案。那么为什么会崩溃呢?请看这行代码:mid=(mid+high)/2;其中mid未被初始化就使用了,C语言中未被初始化的值会根据不同的编译环境是不同的进行默认值分配。“有的是0, 有的是-1,有的是随机值。”如果是0,那么程序应该正常(当然结果不一定是你想要的)。如果是-1或是一个较大的随机值,就会导致以下语句发生崩溃:if(l-&data[mid]==x),原因mid超过了l的长度,l-&data[mid]未被初始化就使用了,即指针指向了空位置,你可以想象会发生什么。至于为什么加上printf(" ");之后就不崩溃了,有可能它改变了mid值,使得mid值刚好落在了l的长度之内。亲测在我电脑上使用这种方式也会崩溃,所有遇到你这种情况只能说你运气好了。楼主可以试试在加上/去掉这行后,分别打印mid值验证。如果l是数组可能遇到有趣的问题,这里就不多说了,有兴趣可以结合下面的一个题目试试:另外,程序中结尾return (false)看起来返回的是boolean值,跟需要返回的int类型值不符合,我的电脑是不能编译通过的,可能编译器不同吧。但是,即使你能够编译通过,查找代码段正常运行,如果没有找到值,应该也会出现问题(崩溃?不是很清楚,或许会有很有趣的东西出现,楼主可以试试看,也希望你能将试验结果分享)。
http://blog.csdn.net/u?viewmode=contents

我要回帖

更多关于 c语言解题思路 的文章

 

随机推荐