函数参数的三种传递方式

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 的值。

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.值传递和引用传递的比较

给出思维导图

猜你喜欢

转载自blog.csdn.net/m0_50829573/article/details/121347988