C++函数的传值调用,将两个数交换

我写的程序如下:
===========================================
#include <iostream>
using namespace std;
void swap(int a,int b)
{int t;
t=a;a=b;b=t;

}
void main()
{int x=7,y=11;
cout<<"x="<<x<<"y="<<y<<endl;
swap(x,y);
cout<<"after swap:"<<endl;
cout<<"x="<<x<<"y="<<y<<endl;
}
=============================================
但运行后的结果是 x=7 y=11
两个数并没有交换位置
求高人解答
#include <iostream>
using namespace std;
void swap(int &a,int &b)
{int t;
t=a;a=b;b=t;
}
void main()
{int x=5,y=6;
swap(x,y);
cout<<x<<y<<endl;}
==============================================
这个程序是正确的
但为什么倒数第二行的swap(x,y);不改为swap(&x,&y);与调用函数对应呢
改成这样后运行是在这一行显示错误,是怎么回事

问:但为什么倒数第二行的swap(x,y);不改为swap(&x,&y);与调用函数对应呢
答:比如一个函数定义为void func(a); 那我们可以这样调用 void func(b)对吧?实际上函数在堆栈上创建了一个临时的变量a 在函数入口处实际上相当与执行了 a=b;这样一条f赋值语句,因为创建了临时变量 所以这也是为什么你一开始两个数没有交换的原因 因为他们交换的是临时变量 函数结束后变量就没有了
如果一个函数定义为void func(int & a);调用的时候可以这样写void func(b)
同样执行了 一个int &b = a;这样的一条语句 所以不会错的 定义了一个引用变量b 引用的是a的值 所以swap就成功交换了 如果调用的时候写成void func(&b) 这个时候相当于 a = &b;也就是传给a的是b的地址 这种情况对应于函数参数是指针的情况 如 void func(int *p)明白了吗?显示错误 我就不知道怎么回事了
温馨提示:内容为网友见解,仅供参考
第1个回答  2008-10-01
用引用啊!
#include <iostream>
using namespace std;
void swap(int a,int b)
{int t;
t=a;a=b;b=t;

}
void main()
{int x=7,y=11;
cout<<"x="<<x<<"y="<<y<<endl;
swap(&x,&y); //就是这里要改一下!!!!
cout<<"after swap:"<<endl;
cout<<"x="<<x<<"y="<<y<<endl;
}
第2个回答  2008-09-30
你的错误在于: 调用函数不能改变传进去的函数值。 所以你把程序改成
void swap(int& a,int& b) //引用形式
{int t;
t=a;a=b;b=t;

或者
void swap(int *a,int *b)
{int t;
t=*a;*a=*b;*b=t;
第3个回答  2008-10-01
新手学就是有这个问题,如果明白引用的意思就很好理解了
&是引用的意思,引用就是别名,你的形参是引用,那么每次调用实参都是实参的别名,那么形参发生变化,实参也会发生变化
而函数是值传递的,你没有引用就不会同时改变实参
如果理解指针那么这就更好理解了
你应该还没有学到指针吧
第4个回答  2008-10-01
void swap(int& a,int& b)
{int t;
t=a;a=b;b=t;

}
应该这么写的~
应该用传引用调用~

补充:
你那么改当然不行~调用只是调用参数~你那是什么调用方式昂~函数那么写就对了~倒数第二行不用改~

C++函数的传值调用,将两个数交换
答:比如一个函数定义为void func(a); 那我们可以这样调用 void func(b)对吧?实际上函数在堆栈上创建了一个临时的变量a 在函数入口处实际上相当与执行了 a=b;这样一条f赋值语句,因为创建了临时变量 所以这也是为什么你一开始两个数没有交换的原因 因为他们交换的是临时变量 函数结束后变量就没有...

C++问题 交换两个数的值
x,y的是定义在函数内部的变量,只能在函数内部使用,函数结束后,x,y就不存在了。你在写函数的时候,完成了x,y的交换,但是并没有通过返回函数或指针把结果会写到i1,i2.和d1,d2。如果你不理解为什么i1和x,i2和y对应的不是同一个东西的话,请阅读C语言教程里关于函数的形参和实参的相关内...

c++指针交换两个字符串的内容
首先,虽然传递的是地址,但是仍然是属于传值调用的范畴。因为指针只是用来赋值,并没有被间接引用。那么你是不是想用传址调用呢,就这个程序而言,也是不行的。你希望通过交换str1和str2的值来实现字符串的赋值,是行不通的。因为,在C++中,任何一个数组的名,都是一个指针,相信这个你也知道,但...

C\/C++问题:为什么以下程序的结果为:23,23
fun(42,23),fun中将这个两个数交换。因为前一个参数采用了引用的形式,fun的参数x就相当于a[1]本身,只是换了一个名字,x与a[1]指向的内存地址相同。所以当fun结束后fun中对它所做的改变还会有效。所以a[1]变成了23 而后一个参数只是传值,相当于fun的y参数只是a[0]的一个副本,y与a[0]指...

c语言问题,什么叫引用啊?
下面讨论引用的两个主要用途:作为函数参数以及从函数中返回左值。二、引用参数 1、传递可变参数 传统的c中,函数在调用时参数是通过值来传递的,这就是说函数的参数不具备返回值的能力。所以在传统的c中,如果需要函数的参数具有返回值的能力,往往是通过指针来实现的。比如,实现 两整数变量值交换的c...

C++的函数交换,下面三个有什么区别?
第一个是传值,a,b,只是作为形参传过去,这样把a的给了x,把b的值给了y。a,b还是原来的值,而x,y的值也会在swap运行结束后释放。以下两个是传地址,传引用。把存储a,b,的具体地址传过去了,在交换的时候具体参与了交换。能实现真的交换。按值传递不能进行真的交换,其余两种可以实际交换。

c语言中,为了交换a和b的值,用传值调用的方式为什么不能交换,而通过传地...
这个你学了C++就会彻底明白,值传参重点是值,他实际上是在函数内部创建了一个临时变量保存你传入的值,你修改的只是那个临时变量.而地址传递同样有临时变量不过这个临时变量存的是地址,你在使用指针交换值时,它实际是通过地址找到你真实的变量进行修改....

C++调用函数时的两种传递方式“传值方式调用”和“引用方式调用”有何...
这一点可以使得引用可以作为函数返回的一种手段,比如考虑计算x*3的void函数:void int x3(int x,int &sum){ sum=x*3;} 在调用之前sum是什么值无关紧要,重要的是调用后sum的值就是x*3的值,这正是我们想要的结果.但是这一点在有些情况下是我们不想看到的,比如有一个数据规模巨大无比的对象...

c++ 小程序题
c++ 调用的问题,有传值调用,和传址调用。传值调用只是把内存空间的值赋给一个变量。base p1=obj 是传值调用,把obj的值赋给p1,【特别要注意】以后这两个变量就互不相关了。base &p2=obj 是传址调用,p2作为obj的一个别名,别名懂吧?就是一个人的另一个名字,但是这链各个人还是一个人...

行参实参搞不清楚了
C\/C++中参数传递有两种方式,传值或传地址(传引用),通常我们要在被调用函数中改变一个变量的值就需要传地址调用方式,例如:void swap_by_value(int a, int b){ int temp;temp = a;a = b;b = temp;} void swap_by_ptr(int* pa, int* pb){ int temp;temp = *pa;pa = *pb;pb...

相似回答