首先我们可以先引入一个中间变量temp进行数值交换。
在C语言中:
下面的这个函数能不能达到函数交换的目的?
void Swap(int x, int y)
{
int temp = 0;
temp = x;
x = y;
y = temp;
}
int main()
{
int x = 1;
int y = 2;
Swap(x, y);
printf("x = %d , y = %d\n", x, y);
system("pause");
return 0;
}
运行一下:
我们发现这个函数是不能完成交换的功能的,这是因为在Swap(int x,int y)被调用时,实参进行副本初始化,函数并没有访问调用传递的实参本身,因而也不会修改实参的值。也就是说函数被调用时传入的是x,y的值,而不是它们的地址。只有传入地址才能在函数调用时通过地址真正改变两个数的值。否则就只是改变了函数栈帧里创建的形参,这样当函数完成调用时,栈帧里面创建的形参就会随之消失,无法完成交换。
所以在C语言中我们通常通过传址来进行两个数的交换,这时候就会利用到指针。
void Swap(int *x, int *y)
{
int temp = 0;
temp = *x;
*x = *y;
*y = temp;
}
int main()
{
int x = 1;
int y = 2;
Swap(&x, &y);
printf("x = %d , y = %d\n", x, y);
system("pause");
return 0;
}
运行一下:
此时就完成了两个数的交换。
在C++中:
C++中我们可以使用引用形参达到目的:
void Swap(int& x, int& y)
{
int temp = 0;
temp = x;
x = y;
y = temp;
}
int main()
{
int a = 1;
int b = 2;
Swap(a, b);
cout << "a = " << a << endl;
cout << "b = " << b << endl;
system("pause");
return 0;
}
运行一下:
此时也完成了两个数的交换。
此外,还有一些其它的交换方法供参考:
x = x^y;
y = x^y;
x = x^y;
x = x*y;
y = x/y;
x = x/y;