您的位置:首页 > 编程语言 > C语言/C++

C++的三种传参方式

2012-12-23 11:01 911 查看
C++中的3三种传值方式。

1、按值传递。

按值传递是最常见的。但是因为相同的值但却可以是不同的内存,这就导致了 我们参数,有时不一定能传到我们要的函数体内。

#include<iostream>

using namespace std;

void swap(int a,int b){
cout<<"swap函数 交换前"<<"a="<<a<<"b="<<b<<endl;
int temp;
temp=a;
a=b;
b=temp;
cout<<"swap函数 交换后"<<"a="<<a<<"b="<<b<<endl;

}

int main(){
int a=3;
int b=4;
cout<<"main函数内 交换前"<<"a="<<a<<"b="<<b<<endl;
swap(a,b);
cout<<"main函数内 交换后"<<"a="<<a<<"b="<<b<<endl;
return 0;

}

-------------------------------------------------------------------------------------------------------------------

运行结果:

main函数内 交换前a=3b=4

swap函数 交换前a=3b=4

swap函数 交换后a=4b=3

main函数内 交换后a=3b=4

Press any key to continue

-------------------------------------------------------------------------------------------------------------------

我们可以看到,在main函数内,并没有把 a和b的值交换,因为这根本就不是a和b。不过是a和b在内存中的拷贝而已。

也就是说,当执行main的时候,程序会在内存中拷贝一份a和b,而拷贝的a和b,根本没有用到swap函数,所以不会交换。

这么说吧,就算你把main函数的a和b全部改为c和d 程序一样运行。结果是一样。

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

2、地址传递;

指针是干什么的? 当然是保存变量的内存地址。所一我们可以定义两个指针变量,用于保存变量的地址,于是 我们把

地址放到 指针上,让指针 指向我们传递的内存地址(内存空间)。那么我们 所传递的形参,只对应同一个地址,所以

这时的形参就可以看成实参了。

#include<iostream>

using namespace std;

void swap(int *a,int *b){
cout<<"swap a的地址"<<&a<<endl;
cout<<"swap b的地址"<<&b<<endl;
cout<<"swap函数 交换前"<<"a="<<*a<<"b="<<*b<<endl;
int temp;
temp=*a;
*a=*b;
*b=temp;
cout<<"swap a的地址"<<a<<endl;
cout<<"swap b的地址"<<b<<endl;
cout<<"swap函数 交换后"<<"a="<<*a<<"b="<<*b<<endl;

}

int main(){
int a=3;
int b=4;
cout<<"main a的地址"<<&a<<endl;
cout<<"main b的地址"<<&b<<endl;
cout<<"main函数内 交换前"<<"a="<<a<<"b="<<b<<endl;
swap(&a,&b);
cout<<"main a的地址"<<&a<<endl;
cout<<"main b的地址"<<&b<<endl;
cout<<"main函数内 交换后"<<"a="<<a<<"b="<<b<<endl;
return 0;

}

-------------------------------------------------------------------------------------------------------------------

运行结果

main交换前 a的地址0018FF44

main交换前 b的地址0018FF40

main函数内 交换前a=3b=4

swap交换前 a的地址0018FEEC

swap交换前 b的地址0018FEF0

swap函数 交换前a=3b=4

swap交换后 a的地址0018FF44

swap交换后 b的地址0018FF40

swap函数 交换后a=4b=3

main交换后 a的地址0018FF44

main交换后 b的地址0018FF40

main函数内 交换后a=4b=3

Press any key to continue

-------------------------------------------------------------------------------------------------------------------

如果有兴趣,你可以把上一个按值传递的方法,a和b的地址都打印一下,对比一下 就应该清楚了。

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

3、引用传递。

为什要用引用传递?什么是引用?它和指针的区别?(如是弄明白这三个问题,我感觉就应该没问题了)。

我们知道 引用的话 系统是不会为其开辟内存的。所以,a和b原来在内存中的位置就是我们引用的位置。

既然内存地址明确了,还怕它传不了参数?

#include<iostream>

using namespace std;

void swap(int &a,int &b){
cout<<"swap a的地址"<<&a<<endl;
cout<<"swap b的地址"<<&b<<endl;
cout<<"swap函数 交换前"<<"a="<<a<<"b="<<b<<endl;
int temp;
temp=a;
a=b;
b=temp;
cout<<"swap a的地址"<<&a<<endl;
cout<<"swap b的地址"<<&b<<endl;
cout<<"swap函数 交换后"<<"a="<<a<<"b="<<b<<endl;

}

int main(){
int a=3;
int b=4;
cout<<"main a的地址"<<&a<<endl;
cout<<"main b的地址"<<&b<<endl;
cout<<"main函数内 交换前"<<"a="<<a<<"b="<<b<<endl;
swap(a,b);
cout<<"main a的地址"<<&a<<endl;
cout<<"main b的地址"<<&b<<endl;
cout<<"main函数内 交换后"<<"a="<<a<<"b="<<b<<endl;
return 0;

}

-------------------------------------------------------------------------------------------------------------------

运行结果:

main a的地址0018FF44

main b的地址0018FF40

main函数内 交换前a=3b=4

swap a的地址0018FF44

swap b的地址0018FF40

swap函数 交换前a=3b=4

swap a的地址0018FF44

swap b的地址0018FF40

swap函数 交换后a=4b=3

main a的地址0018FF44

main b的地址0018FF40

main函数内 交换后a=4b=3

Press any key to continue

-------------------------------------------------------------------------------------------------------------------

只要多思考,多写写,在把上面的运行结果 对比一下。所有的问题就都解决了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: