我们都知道,想要在函数中修改某个变量的值,传变量本身是没有用的。原因在于不同的函数在不同的空间上,函数的生命周期随着函数的调用而结束,因此在函数内部进行的值操作是不会对函数外的变量产生影响的。所以在函数里面想要修改变量的值,必须使用指针。
可是当阴险的助教跟你玩阴的的时候,指针似乎也不好使了....来看看可爱的助教们是怎样坑害清澈愚蠢的大学生的吧~
给出下述程序的执行结果
#include <stdio.h>
void swap(int *p, int *q){
int *t;
t=p;
p=q;
q=t;
}
int main(){
int a=10,b=20;
swap(&a,&b);
printf("a=%d,b=%d\n",a,b);
return 0;
}
乍眼一看,哼哼,小小的swap函数不就是交换两个变量的值吗,这有何难!
自信写下:a=20,b=10
然后....
听取完一片WA声之后,得看看问题出在了那里。
上面这个是还没有进行swap的地址
这个是已经交换过后的地址,你会发现没有变。
其实问题的本质是简单的,当你在函数中进行交换的时候,你只是在函数内部对函数的p和q变量进行了交换地址,而&a,&b本质上不是变量(即没有用一个新的变量名来对他们进行存储)而是一个值,所以无论怎样交换,只要你从函数中出来,a和b这两个变量还在,当你写&a,&b的时候,可以理解为又一次的对a和b进行取地址操作,他们俩的地址就不会改变,输出的值也不会改变。
那么假设我们使用两个变量来存储地址呢?
还是没有变(a仍然等于10)!这说明前面的理解是肤浅的,哪怕我们使用了两个变量来存储地址,还是会出现问题。
经过了解之后,上面问题的原理,本质上就是一个:函数传的形参无论它是什么类型,在函数中进行的操作,在主函数或者其他函数中都是无效的(即相应的修改不会对主函数中的这个变量产生影响)。之前我们说想要在函数中修改一个变量的值要传指针,其实是一条普适性的原理。大家可以想一想,指针其实本质上也是一种变量,那么想要修改指针的话就要传入指针的指针——二级指针! 因此本例中在函数中的交换指针的值其实是无效的,a的地址还是a的地址。所有问题就迎刃而解了。
总结来说就是我上面说的那句话:想要在函数中修改一个变量(普通变量,包括指针,二级指针!)的值要传指针!所有函数传参修改值的问题就秉持这个原则就行了!