永发信息网

C语言,这样为什么不可以实现两个数值的交换?

答案:7  悬赏:0  手机版
解决时间 2021-11-07 04:39
C语言,这样为什么不可以实现两个数值的交换?
最佳答案
因为在swap函数中,a b的地址和x y的地址不同,其变化与X y本身无关,如果要交换,需要把x y的地址传到子函数中,进行交换!
 #include
  void swap(int *a ,int *b )
  {
  
           int temp;
           temp=*a;
           *a=*b;
           *b=temp;
   }      
 int main()
 {
         int x=3;
         int y=4;
         swap(&x, &y);
         printf("%d%d",x,y);


 }

全部回答
你调用函数是采用传值方式,将x y的值传递过去,但是x y却并未发生改变
要想改变,建议传地址,用指针交换

ab你可以看做是xy的复制品
普通的非引用类型的参数通过复制对应的实参实现初始化。当用实参副本初始化形参时,函数并没有访问调用所传递的实参本身,因此不会修改实参的值。
对于你这个程序,在执行swap时,只交换了实参的局部副本,而传递给swap的实参并没有被修改。
简单一点说,就是函数传递的时候有几种传递方式,一种是值传递,一种是引用传递,一种是地址传递.你这里是值传递方式.也就是说,传递进去的只是实参的一个拷贝.拷贝只是局部变量,当子程序返回时,就会被析构.所以,实参并没有被改变
void swap(int& a ,int& b )可以改为这样,(引用传递)

void swap(int* a,int* b)或者这样,(地址传递)
用void swap(int& a,int& b)就可以
形参是你调用函数时候创建的临时变量,函数结束该变量就被丢弃了
这样的实现相当于实参给形参赋值,形参是子函数中的变量,他与实参完全没有关系,在子函数中实现了两个形参的值进行互换,对实参无影响
若想实现实参的值互换,则可把形参类型改为指针或者引用,这样操作形参,即是操作实参。
因为在swap函数中,a b是x y的数据复制品,其变化与X y本身无关,如果要交换,需要传递x y的地址到子函数中,进行交换!
1 #include
2 void swap(int *a ,int *b )
3 {
4
5 int temp;
6 temp=*a;
7 *a=*b;
8 *b=temp;
9 }
10 int main()
11 {
12 int x=3;
13 int y=4;
14 swap(&x, &y);
15 printf("%d%d",x,y);
16 }
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
26岁这个年龄幼稚吗?
汽车皮带过紧对车有什么影响?
女朋友为什么不满足我的生理需求?为什么?还
淘宝上找人代付买东西,他会知道我买了什么不
为什么微笑狗恐怖
iPad和电脑那个对眼睛危害大?
浙江师范大学行知学院2011届的本科新生住宿条
洪江市怀化玫瑰花缘地址是什么,有没有知道的
明明很困,眼睛都涩得睁不开了,可是真正闭上
长春全民健身中心游泳馆,什么时候能装修好营
4G+网络有哪些地区支持
男人要是真的喜欢一个女人一定会去追她是吗?
用试管夹夹持试管加热时。试管夹应由试管(
这里面最漂亮是哪个女生
桥板张拉的钢绞线是几根一起穿还是一根一根地
推荐资讯
问摩拜哈罗OFO共享单车是什么?摩拜哈罗OFO共
10代线液晶面板什么意思?
林川珊珊现在怎么样了
我去年刚上高中寄宿学校,学校我认识了和我家
屠宰场每头猪上的字怎么去认
果皮晒前如何防止发霉
从阜阳到天义怎么坐车
如果复数(m2+i)(1+mi)是实数,则实数m=__
克林斯这个牌子的吉他怎么样
体热容易上火的人,怎么办?
绘制了回归的航向指的是什么的伟大构想,
高颧骨的颧念什么
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?