直接上代码了,原理讲解都放在代码注释里了
#include<iostream>
using namespace std;
/*地址传递:两个形参是指针变量
函数调用时传递给形参的是实参的地址,例如&m,&n,
函数执行结果是:指针的指向并没有改变,改变的是指针指向地址的内容
地址传递实际上也是值传递,只不过传递的是参数的地址,
由于内存空间的唯一指向性,实参和形参都会指向同一个内存单元,
因此相残所指向内存单元发生变化,实参所指向内存单元也会发生变化。
*/
void goodswap(int *a,int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}
/*这是一个有问题的函数
temp是一个临时指针变量,并且没有进行初始化,也就是指针temp所指向的单元是不可预见的
对*temp赋值就是对一个未知的存储单元赋值,而这个未知的存储单元可能存储着一个有用的数值
这样就有可能破坏系统的工作状态
*/
void badswap(int *a,int *b)
{
int *temp;
*temp=*a;
*a=*b;
*b=*temp;
}
/*值传递
实参是通过值传递给函数的,这意味着形参接受的只是发送给他们的值的副本,他们存储在函数的本地内存中,
对形参值进行任何改变都不会影响原始实参得值。
函数执行结果:形参变量内容互换了,就是a和b互换了,但是实参变量并没有发生改变;
由于实参变量与形参变量之间是单向的“值传递”方式,也就是实参可以传递给形参,但是形参不能再回传给实参
形参改变的只是实参的副本,因此形参值的改变不能使实参随之改变
*/
void errorswap(int a,int b)
{
int temp;
temp=a;
a=b;
b=temp;
}
/*
因为C语言单向传递的特性,
想要把形参a和b return给实参m,n是做不到的,因为C/C++函数不能有多个返回值,除非使用引用传递的方式
*/
int fakeswap(int a,int b)
{
int temp;
temp=a;
a=b;
b=temp;
return a,b;
//return b; //只能有一个返回值
}
/*
引用传递:实参与形参之间双向传递。引用是C++中的概念,因此只能在C++中使用
忽略实现原理,引用就是变量的一个别名,它没有自己的存储数据的内存位置,其访问的是另一个变量的内存位置,
对引用变量做出的任何改变,都是对它所引用得变量内存位置中数据的更改。
使用引用变量作为形参,引用变量就是实参列表中相应变量的别名,对形参的任何改变都将真正更改正在调用它的函数中的变量
*/
void swap(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
}
int main(int args,char **argv,char *envp[])
{
int m,n;
cout<<"please input m and n:"<<endl;
//cin>>"m=">>m>>','>>"n=">>n;
cin>>m>>n;
cout<<"----begore swap-------"<<endl;
cout<<"m="<<m<<','<<"n="<<n<<endl;
cout<<"adress_m="<<&m<<','<<"adress_n="<<&n<<endl;
cout<<"----after goodswap--------"<<endl;
goodswap(&m,&n); //传递给函数形参的是变量m和n的地址
cout<<"m="<<m<<','<<"n="<<n<<endl;
cout<<"adress_m="<<&m<<','<<"adress_n="<<&n<<endl;
cout<<endl;
cout<<"----begore swap-------"<<endl;
cout<<"m="<<m<<','<<"n="<<n<<endl;
cout<<"adress_m="<<&m<<','<<"adress_n="<<&n<<endl;
cout<<"----after errorswap--------"<<endl;
errorswap(m,n);
cout<<"m="<<m<<','<<"n="<<n<<endl;
cout<<"adress_m="<<&m<<','<<"adress_n="<<&n<<endl;
cout<<endl;
cout<<"----begore swap-------"<<endl;
cout<<"m="<<m<<','<<"n="<<n<<endl;
cout<<"adress_m="<<&m<<','<<"adress_n="<<&n<<endl;
cout<<"----after swap--------"<<endl;
swap(m,n);
cout<<"m="<<m<<','<<"n="<<n<<endl;
cout<<"adress_m="<<&m<<','<<"adress_n="<<&n<<endl;
cout<<endl;
cout<<"----begore swap-------"<<endl;
cout<<"m="<<m<<','<<"n="<<n<<endl;
cout<<"adress_m="<<&m<<','<<"adress_n="<<&n<<endl;
cout<<"----after fakeswap--------"<<endl;
m,n=fakeswap(m,n);
cout<<"m="<<m<<','<<"n="<<n<<endl;
cout<<"adress_m="<<&m<<','<<"adress_n="<<&n<<endl;
}
结果:
image.png
欢迎指正!
网友评论