在最近时间内,关于指针传参后交换数据有疑问,对此进行详尽分析,如下:
#include<stdio.h> #include<stdlib.b> void test(int *m,int *n) { int *temp; printf("初始*m = %d,*n = %d\n",*m,*n); temp = m; m = n; n = temp; printf("交换后*m = %d,*n = %d\",*m,*n); } int main() { int a,b; a = 2; b = 3; printf("初始a = %d,b = %d\n",a,b); test(&a,&b); printf("交换后a = %d,b = %d",a,b); return 0; }其运算结果如下所示:
通过结果可以发现:只是子函数的值发生了交换,而主函数中的值依旧保持原值。 而一般按照理解,指针传过去地址,无论主函数还是子函数的值都会发生改变,那麽造成这一结果的原因是啥呢? 首先,需明白程序在调用子函数时,会额外申请一个个的空间来作为形参的储存地址,(当然若是指针则是指向原值)如下所示:
则可知,上述的程序过程交换的只是交换了子函数中的指针m,n的指向的地址,并没有真正改变a和b的数值。·执行子函数后其图如下:
其中对于指针m和n在子函数的调用结束后,会由程序自然释放,所以在主程序中的a和b的值是没有改变的。若要改变可按照下列方式改变:
#include<stdio.h> #include<stdlib.h> void test(int *m,int *n) { int temp; temp = *m; *m = *n; *n = temp; } int main() { int a,b; a = 2; b = 3; printf("初始a = %d,b = %d\n",a,b); test(&a,&b); printf("交换后a = %d,b = %d\n",a,b); }其结果如下: 这种方式是通过运用指针来进行间接改变a和b的值,来实现主函数中的a和b的值的改变的。
