向阳红号科考船1号主管:C语言问题3

来源:百度文库 编辑:神马品牌网 时间:2024/05/07 11:35:27
void f(int v , int w)
{ int t;
t=v;v=w;w=t;
}
main( )
{ int x=1,y=3,z=2;
if(x>y) f(x,y);
else if(y>z) f(y,z);
else f(x,z);
printf(“%d,%d,%d\n”,x,y,z);
}
执行后输出结果是
A) 1,2,3 B) 3,1,2 C) 1,3,2 D) 2,3,1
答案C我算出来是A为什么它没有换真奇怪能讲一下吗?

因为调用子函数时并不返回空间,这个子函数只是将V W互换了,并没有换X,Y若想实现得用指针

C是正确的。
因为c语言中,参数传递是单向的。只能由实参传给形参。
本程序中形参的改变不会影响的实参的变化的。
但并不是说真的形参不能改变实参。只要略微修改就可以了。请看下面程序:
void f(int *v , int *w)
{ int t;
t=*v;*v=*w;*w=t;
}
main( )
{ int x=1,y=3,z=2;
if(x>y) f(&x,&y);
else if(y>z) f(&y,&z);
else f(&x,&z);
printf(“%d,%d,%d\n”,x,y,z);
} 经运行是正确的。
有人会问“你不是说‘参数传递是单向的。只能由实参传给形参。’,难道这不矛盾吗?”。其实不矛盾。
因为在楼主的程序中,主函数中的变量x,y,z与被调函数中的w,v没有任何关系。他们是分别占用5个不同内存单元的变量。w,v的变化不会改变x,y,z内存单元的值。
而我给的程序,传递的是指针。而且指针指向的就是x,y,z的内存单元。所以修改被调函数中参数就相当于直接修改x,y,z的内存单元。