菜鸟对互换两个数经典swap函数的理解

2014-07-19 18:18:33   3470

swap(int a,int b)与swap(int * a, int *b)


过程:

主函数中定义

int m=5;

int n= 4;

//这里姑且当在超市里找两个盒子1,2,每个盒子有自己的位置(即地址),为了识别和给两个盒子起名1,2(即m,n),然后m=5,n=4

相当于把5和4放在名字叫1,2的盒子里,(盒子的位置地址和名字是在这定义的),为什么定义名字,因为直接用地址不方便

swap(int a, int b)
{
int temp = a;
a = b;
b = temp;
}

调用

swap(m,n);

过程:

m,n是实参,a,b是形参, 当调用函数时,定义生成形参a,b(函数调用时产生int a,int b的动作所以函数调用时才产生),然后产生

a = m, b= n的动作,也就是说a,b是m,n的副本(copy产生,copy的是m,n的值,所以叫按值传递),所以对a,b做的任何动作并不影响原来的m,n,(相当于在其他位置(地址)又找了两个其他的盒子起名a,b,然后再对这两个新的盒子里面操作并不影响原来的),另外a,b 的作用域在在swap(int a,int b)函数内,出了这个函数,ab释放消亡。(所以ab也可以与主函数一样取名mn这样更容易迷惑)

swap(int * a, int *b)
{
int* temp =a;
a = b;
b = temp;
}

调用swap(&m,&n)

过程:

定义指针a,b ,然后a指向 储存变量m的地址(盒子1),b指向变量储存变量n的地址(盒子2),再定义临时指针temp 并把a赋值给它,即temp与a指向相同的地址(都指向盒子1), 然后把b赋值给a, 现在a指向盒子2了, 然后temp赋值给b ,现在b指向盒子1,所以此函数的结果是形参a,b指向的地址互换了,而盒子里的东西(m的值和n的值)不变,当跳出函数时,主函数中原来的m盒子1中,n盒子2中的东西(值)并没有改变。

void swap(int* a, int* b)
   {
    
   int temp=*a;
   *a=*b;
   *b=temp;
   }

调用swap(&m,&n)

过程:

     定义指针a,b,然后a指向 变量m的地址(盒子1),b指向变量n的地址(盒子2),再定义临时int型变量temp,*a表示指针a所指向的地址(盒子)里的值,然后赋值给temp(temp = 5);然后 *b表示b所指向地址的值(盒子2里的值是4)赋值给*a,(即放到a所指向的盒子1),此时盒子1里的值是4, 然后再把temp(值为5)赋值给b所指向的盒子1里。所以出了这个函数后,虽然那两个位置上的盒子还是叫m,n,但是盒子里的东西(值),已经发生了改变。所以m =4, n=5