#include <iostream>
void swapr(int & a,int & b); //a,b are aliases for ints
void swapp(int * p,int * q); //p,q are addresses of ints
void swapv(int a,int b); // a,b are new variables
int main()
{
using namespace std;
int wallet1=300;
int wallet2=350;
swapr(wallet1,wallet2);
swapp(&wallet1,&wallet2);
swapv(wallet1,wallet2);
return 0;
}
void swapr(int & a,int & b)
{
int temp;
temp = a;
a = b;
b = temp;
}
void swapp(int * p, int * q)
{
int temp;
temp = *p;
*p = *q;
*q = temp;
}
void swapv(int a, int b)
{
int temp;
temp = a;
a = b;
b = temp;
}
/*三个函数结果分别为
350,300
300,350
300,350
*/
按引用传递(swapr(wallet1,wallet2))和按值传递(swapv(wallet1,wallet2))看起来相同。只能通过原型或函数定义才能知道swapr()是按引用传递的。然而,地址运算符(&)使得按地址传递(swapp(&wallet1,&wallet2))一目了然(类型声明int * p表明,p是一个int指针,因此与p对应的参数应地址,如(&wallet1)。
在swapr中,变量a和b是wallet1和wallet2的别名,所以交换a和b的值相当于交换wallet1和wallet2的值;
但在swapv中,变量a和b是复制了wallet1和wallet2的值的新变量,因此交换a和b的值并不会影响wallet1和wallet2的值。
最后,函数swapr()(传递引用)和swapp()(传递指针)的不同,第一个区别是声明函数参数的方式不同
void swapr(int & a,int & b)
void swapp(int * p, int * q)
另一个区别是指针版本需要在函数使用p和q的整个过程中使用解除引用运算符 *;
摘自C++ Primer Plus