C++传值方式和传址方式(以交换函数为例)

//以下三个函数都是实现将变量 i 和 j 的值交换
/*=========================方式一=====================================*/
/****************下面的函数无法实现此功能********************************/
/*==================================================================*/
#include <iostream>
using namespace std;
int main()
{
    void swap(int, int);        //函数声明
    int i=3;
    int j=5;
    swap(i,j);
    cout << i << " "<<j <<endl;
    return 0;
}

void swap(int a,int b)
{
    int temp;
    temp=a;
    a = b;
    a=temp;
}
/*=========================方式二====================================*/
/********************使用指针变量作形参,实现两个变量的值的交换********/
/*==================================================================*/
#include <iostream>
using namespace std;
int main()
{
    void swap(int *, int *);
    int i=3;
    int j=5;
    swap(&i, &j);
    cout << i << " "<< j <<endl;
    return 0;
}
void swap(int *p1,int *p2)
{
    int temp=0; 
    temp=*p1;
    *p1=*p2;
    *p2=temp;
}
/*==========================方式三==================================*/
/**********************实现两个变量的值的交换,用“引用”作形参**************/
/*==================================================================*/
#include <iostream>
using namespace std;
int main()
{
    void swap(int &, int &);
    int i=3;
    int j=5;
    swap(i, j);
    cout << i << " "<< j <<endl;
    return 0;
}

void swap(int &a, int &b)
{
    int temp;
    temp=a;
    a=b;
    b=temp; 
}

 总结:

  1、方式一未能实现两个参数的交换。

  2、前两种方式传递的是实参的值。即是传值方式

  3、前两种方式在调用swap函数时,对形参要分配存储单元,方式三对引用型形参a和b不分配存储单元,它们分别与实参i和j共享同一存储单元。而方式三swap函数传递的是实参变量的地址而不是实参变量的值。即传址方式。

  4、在方式三中,&a不是"a的地址",而是指“a是一个整形变量的(引用)别名”,&是引用声明符。由于是形参,不必对其初始化,即未指定它们是哪个变量的别名。当main函数调用swap函数时,进行虚实结合,把实参变量i和j的地址传给形参a和b.这样i和j的地址传给a and b.这样i和a的地址相同,二者是同一变量,即a成为i别名。同理,b成为j的别名。在swap函数中,a和b的值交换,那么i和j的值也交换了。

原文地址:https://www.cnblogs.com/zxwAAA/p/2996207.html