/***
* 传值调用
* 传址调用
* 引用调用
*
* ***/
#include<iostream>
using namespace std;
void swap_num(int x, int y);
void swap_addr(int * x, int * y);
void swap_quote(int & x, int & y);
int main()
{
int a = 3, b = 2;
cout<<"原始数据:"<<" a= "<<a<<" b= "<<b<<endl;
swap_num(a, b);
cout<<"传值调用:"<<" a= "<<a<<" b= "<<b<<endl;
swap_addr(&a, &b);
cout<<"传址调用:"<<" a= "<<a<<" b= "<<b<<endl;
swap_quote(a, b);
cout<<"引用调用:"<<" a= "<<a<<" b= "<<b<<endl;
}
//
//
/*
* 没有完成交换
* 因为在传参调用中,main调用swap时候,将实参a, b的值分别拷贝给形参x, y,然后a, b就不再和swap有关了,
* swap交换的是x, y的值,但是x, y的作用域只在swap中,
* 他们确实完成了交换,但是swap结束之后,x, y的值也就随之销毁了,
* 所以根本不会对形参有任何影响,当然就不会实现实参的交换
*/
void swap_num(int x, int y)
{
int tmp = x;
x = y;
y = tmp;
}
//
/*
* 完成交换
* 传址调用实际上还是实参到形参的拷贝,
* 不过这次实参是要交换的两个数字的指针(即地地址),而不是要交换的两个数本身,
* 虽然形参在swap结束后被销毁,但是形参是根据要交换的两个数的地址完成交换的,
* 所以对这两个数字产生影响,也就完成交换
*/
void swap_addr(int * x, int * y)
{
int tmp = *x;
*x = *y;
*y = tmp;
}
//
/*
* 完成交换,
* 但是这里的语法和上面的两种都不一样,
* 这里并没有实参到形参的拷贝,而是直接将main里面的a, b传到swap里面,
* 所以当然交换的就是a, b的值。
*/
//这段代码如果用gcc编译会报错,因为引用调用在C里面不合法,要用g++进行编译
void swap_quote(int & x, int & y)
{
int tmp = x;
x = y;
y = tmp;
}
//
结果如下:
//
传值调用: a= 3 b= 2
传址调用: a= 2 b= 3
引用调用: a= 3 b= 2