1、正确做法
void swap(int *x,int *y)
{
int temp = *x;
*x = *y;
*y = temp;
}
void swap(int &x,int &y)
{
int temp = x;
x = y;
y = temp;
}
2、典型的错误做法
- void swap(int *x,int *y)
{
int *temp = x;
x = y;
y = temp;
}
- void swap(int x,int y)
{
int temp = x;
x = y;
y = temp;
}
分析:这里需要考虑的是函数中形参和实参的传递。
首先,如果形参是基本类型的对象,在调用到函数的时候,系统需要给形参申请空间,用实参去初始化形参。所以,此时,函数中 发生变化的是形参,不改变实参对象。
其次,如果形参是指针类型,先看一下下面的小程序
int n = 0, i = 42;
int *p = &n;
*p = 42; //此时,对象n的值发生变化,由0 变为42
缘由:指针p指向对象n,*p改变的是p所指向的对象的值,即修改*p,实际修改的是n的值,故两值交换的时候,使用指针形形参可以实现正常的交换
最后,如果形参是引用类型,引用是给一个对象另起一个名字,引用赋值的语句
int i = 0;
int &n = i; //n是对象i的别名,对n进行操作,实际上就是对i进行操作
则,函数中操作的形参是实参的别名,改变形参也就是改变实参,故使用引用形参可实现正常的值交换