C++:函数参数传递-值传递、指针传递、引用传递
1、参数传递:
值传递:形参是实参的拷贝,改变形参的值并不会影响外部实参的值;
指针传递:传递的是一个外部实参的地址,当被调用函数的形参发生变化时,实参也会变化;
引用传递:实参和形参通过引用绑定;形参的任何改动都会直接影响到实参;
【注】:当某种类型不支持拷贝操作时,或拷贝大的类类型对象时比较低效,函数只能通过引用形参访问该类型的对象;
【注】:如果函数无须改变引用形参的值,最好将其声明为常量引用;

2、示例:对两个整数进行交换;
代码如下:
#include "stdafx.h"
#include <iostream>
using namespace std;
//值传递
void swap1(int p,int q)
{
int temp;
temp=p;
p=q;
q=temp;
}
//指针传递,函数体内只有指针值的变化
void swap2(int *p,int *q)
{
int temp;
temp=*p;
*p=*q;
*q=temp;
}
//指针传递,函数体内只有指针的变化
void swap3(int *p,int *q)
{
int *temp;
temp=p;
p=q;
q=temp;
}
//引用传递
void swap4(int &p,int &q)
{
int temp;
temp=p;
p=q;
q=temp;
}
int main()
{
int a=1,b=2;
cout<<"before swap ..."<<endl;
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
swap1(a,b);
//swap2(&a,&b);
//swap3(&a,&b);
//swap4(a,b);
cout<<"after swap ..."<<endl;
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
system("pause");
return 0;
}

3、值传递:形参是实参的拷贝,改变形参的值并不会影响外部实参的值;
//值传递
void swap1(int p,int q)
{
int temp;
temp=p;
p=q;
q=temp;
}
int main()
{
int a=1,b=2;
cout<<"before swap ..."<<endl;
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"a 的地址= "<<&a<<endl;
cout<<"b 的地址= "<<&b<<endl;
swap1(a,b);
//swap2(&a,&b);
//swap3(&a,&b);
//swap4(a,b);
cout<<"after swap ..."<<endl;
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"a 的地址= "<<&a<<endl;
cout<<"b 的地址= "<<&b<<endl;
system("pause");
return 0;
}

4、指针传递一:swap2()
swap2和swap3都是指针传递,
swap2函数体内交换了p和q指向地址的值;
//指针传递,函数体内只有指针值的变化
void swap2(int *p,int *q)
{
int temp;
temp=*p;
*p=*q;
*q=temp;
}
int a=1,b=2;
swap2(&a,&b);//指针传递
解释:
实参a的值为1,a的地址为CE4;
实参b的值为2,b的地址为D04;
指针传递过程中传递的是a,b的地址;
形参p是指向a地址CE4的指针,p的地址为CE0;
形参q是指向b地址D04的指针,q的地址为CE8;
此时,解引用指针*p的值为1;
解引用指针*q的值为2;
故swap2函数体内交换了p和q指向地址的值;

5、指针传递二:swap3()
swap3函数体内交换了p和q指向的地址
//指针传递,函数体内只有指针的变化
void swap3(int *p,int *q)
{
cout<<"before swap ..."<<endl;
cout<<"p 的地址= "<<&p<<endl;
cout<<"q 的地址= "<<&q<<endl;
cout<<"*p = "<<*p<<endl;
cout<<"*q = "<<*q<<endl;
int *temp;
temp=p;
p=q;
q=temp;
cout<<"after swap ..."<<endl;
cout<<"p 的地址= "<<&p<<endl;
cout<<"q 的地址= "<<&q<<endl;
cout<<"*p = "<<*p<<endl;
cout<<"*q = "<<*q<<endl;
}
//调用
int a=1,b=2;
swap3(&a,&b);//指针传递
解释:
实参a的值为1,a的地址为8C4;
实参b的值为2,b的地址为8E4;
指针传递过程中传递的是a,b的地址;
形参p是指向a地址8C4的指针,*p值为1;
形参q是指向b地址8E4的指针,*q值为2;
此时对指针p,q的值即8C4,8E4进行交换,
交换之后,
形参p是指向a地址8E4的指针,*p值为2;
形参q是指向b地址8C4的指针,*q值为1;
但a和b地址中的值并未发生变化,故a和b不变;
故swap3函数体内交换了p和q指向的地址;

6、引用传递:实参和形参通过引用绑定;形参的任何改动都会直接影响到实参;
//引用传递
void swap4(int &p,int &q)
{
cout<<"before swap ..."<<endl;
cout<<"p = "<<p<<endl;
cout<<"q = "<<q<<endl;
cout<<"p = "<<&p<<endl;
cout<<"q = "<<&q<<endl;
int temp;
temp=p;
p=q;
q=temp;
cout<<"after swap ..."<<endl;
cout<<"p = "<<p<<endl;
cout<<"q = "<<q<<endl;
cout<<"p = "<<&p<<endl;
cout<<"q = "<<&q<<endl;
}
//函数调用
int a=1,b=2;
swap3(a,b);//指针传递
解释:
实参a的值为1,a的地址为744;
实参b的值为2,b的地址为764;
引用传递:将实参和形参绑定在一起;
形参p的值为1,p的地址为744;
形参q的值为2,q的地址为764;
交换后,
形参p的值为2,p的地址为744;
形参q的值为1,q的地址为764;
实参a的值为2,a的地址为744;
实参b的值为1,b的地址为764;
故swap4引用传递等同于对实参的操作,即传递的不是实参的副本,而就是实参;
