C++的三种传参方式

来源:互联网 发布:行测题库软件 编辑:程序博客网 时间:2024/06/01 08:46

哎,写C写的好崩溃啊。。各种小问题。。

转载自:http://blog.csdn.net/djy_ok/article/details/8392952


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
-------------------------------------------------------------------------------------------------------------------
只要多思考,多写写,在把上面的运行结果 对比一下。所有的问题就都解决了。
0 0