如何交换两个变量的值在我们编写代码的时候非常常见,也是一个比较经典的算法了,下面我们就从操作系统中堆栈的角度来说一说这个算法,首先我们先看下面这段代码。
这段看起来没有任何错误的代码执行出来的结果却是这样:
显然并没有得出我们想要的结果,原因就在于,我们在exchange()函数中完成的交换变量的操作其实并没有改变原来的num1和num2的值,在系统堆栈中,从主函数开始,首先将num1和num2的值入栈,然后执行调用exchange()函数的操作,这时候在栈中会有一个保护主函数现场信息的操作,以便调用完exchange()函数后回到主函数中继续进行下一步操作,然后将exchange(num1,num2)中的实参变量从右到左依次入栈,此时形参与实参对应起来,开始进行exchange()函数中的操作,但此刻已完成的交换变量的操作相当于是在另一个与之前主函数中定义的变量毫无关系的空间中完成的,因此原来的变量值并没有被改变。
因此我们修改方案,使用另一个方法进行操作:
执行结果:
找到错误原因之后修改代码便变的简单了许多,其实我们只是利用指针来解决了这个问题,在exchange()函数中,交换变成了,将one所指的空间的值赋值给tmp空间,将another所指的空间的值赋值给one空间,再将tmp空间的值赋值给another所指向的空间,这样利用指针直接对原先定义的变量进行操作,并且在系统堆栈中,存在的就不是再次复制一份的值而是存储原先变量的地址,因此能够交换成功。