1.值传递
我们先来看一段代码
//代码5.1
#include <iostream>
void Exchg1(int , int);
int main()
{
using namespace std;
int a=4,b=6;
Exchg1(a, b);
cout << "a = "
<< a
<< ","
<< "b = "
<< b << endl;
//return 0;
}
void Exchg1(int x,int y)
{
using namespace std;
int temp;
temp = x;
x = y;
y = temp;
cout << "x = "
<< x
<< ","
<< "y = "
<< y << endl;
}
程序的运行结果如下图
发现调用值交换函数后,a、b并没有像预期的那样调换,而是原封不动地输出了;
这里就涉及到一个知识误区,我们把调用Exchg1函数的过程单独拿出来
//代码5.2
int x = a;
int y = b;
int temp;
temp = x;
x = y;
y = temp;
cout << "x = "
<< x
<< ","
<< "y = "
<< y << endl;
第2、3行代码是调用函数时的两个隐含动作 ;
总结一下, 函数在调用时是隐含地把实参 a、b 的值分别赋值给了 x、y, 之后在你写的 Exchg1 函数体内再也没有对 a、b 进行任何的操作了。交换的只 是 x、y 变量。并不是 a、b。当然 a、b 的值没有改变,函数只是把 a、b 的 值通过赋值传递给了 x、y,函数里头操作的只是 x、y 的值并不是 a、b 的值。
扫描二维码关注公众号,回复:
13416673 查看本文章
2.地址传递
//代码5.2
#include <iostream>
void Exchg2(int *px, int *py);
int main()
{
using namespace std;
int a = 4,b = 6;
Exchg2(&a, &b);
cout << "a = "
<< a
<< ","
<< "b = "
<< b << endl;
return 0;
}
void Exchg2(int *px,int *py)
{
using namespace std;
int temp = *px;
*px = *py;
*py = temp;
cout << "*px = "
<< *px
<< ","
<< "*py = "
<< *py << endl;
}
代码5.2的运行结果如下图所示
和值传递不同,这次a、b成功地交换了值
写出Exchg2函数的过程
px = &a; /* ← */
py = &b; /* ← 请注意这两行,它是调用 Exchg2 的隐含动作。*/
int tmp = *px;
*px = *py;
*py = tmp;
指针 px、py 的值已经分别是 a、b 变量的地址值了。接下来,对*px、*py 的操作当然也就 是对 a、b 变量本身的操作了。所以函数里头的交换就是对 a、b 值的交换了。
3.引用传递
//代码5.3
#include <iostream>
void Exchg3(int &x, int &y); /* 注意定义处的形式参数的格式与值传递不同 */
int main()
{
using namespace std;
int a=4,b=6;
Exchg3(a, b);/*注意:这里调用方式与值传递一样*/
cout << "a = "
<< a
<< ","
<< "b = "
<< b << endl;
//return 0;
}
void Exchg3(int &x,int &y)
{
using namespace std;
int temp;
temp = x;
x = y;
y = temp;
cout << "x = "
<< x
<< ","
<< "y = "
<< y << endl;
}
程序的运行结果如下图所示,从结果来看是成功的
注意比较与值传递代码的不同, 参数 x、 y 是 int 的变量,调用时我们可以像值传递 ;
x、y 前都有一个取地址符号“&”。有 了这个,调用 Exchg3 时函数会将 a、b 分别代替了 x、y 了,这就是x、y 分别引用了 a、b 变量。
4.值传递和引用传递的比较
给出思维导图