前言:
因为本人在学习二叉树时碰到过指针的引用,一开始非常不能理解指针引用的具体含义,在查阅相关资料并进行梳理后,终于有所领悟,故作此文以加深对于引用的理解。
先贴一段代码:
#include<stdio.h>
void swap_1(int *a,int *b){ //注意,这里传入的不是原始的指针,而是一个a,b的副本,因此对a,b
//指针的修改不会对原始指针造成影响!!!
int *temp;
temp=a;
a=b;
b=temp;
printf("交换中a=%d b=%d\n",*a,*b);
}
void swap_2(int* &a,int* &b){ //指针的引用,对指针的修改会作用于传进来的原始指针a,b
int *temp;
temp=a;
a=b;
b=temp;
printf("交换中a=%d b=%d\n",*a,*b);
}
void swap_3(int* a,int* b){
int temp;
temp=*a;
*a=*b;
*b=temp;
printf("交换中a=%d b=%d\n",*a,*b);
}
int main(){
int a=1,b=2;
int *p=&a,*q=&b;
printf("交换前a=%d b=%d\n",a,b);
swap_1(p,q);
printf("交换后a=%d b=%d\n",*p,*q);
printf("-------------\n");
p=&a,q=&b; //保险起见重新让p,q指向初始位置。
printf("交换前a=%d b=%d\n",a,b);
swap_2(p,q);
printf("交换后a=%d b=%d\n",*p,*q);
printf("-------------\n");
p=&a,q=&b; //保险起见重新让p,q指向初始位置。
printf("交换前a=%d b=%d\n",a,b);
swap_3(p,q);
printf("交换后a=%d b=%d\n",*p,*q);
return 0;
}
大家可以猜猜运行结果是怎么样的?
此时,肯定会有小伙伴会问,我三个函数传入的明明都是指针变量,教材也说是如果传参传的是指针的话,应该会改变原来参数的才对。但结果却是第一个函数没有交换p,q指针指向的值,而第二第三个函数却交换了p,q指针指向的值呢?
这里牵扯到一个根本性的概念:
C语言只有值传递一种方式!无论函数以什么形式传递,其实传递的都只是参数的一个拷贝(副本)。
而我们平常做的最多的是用指针传递参数,然后在函数体里改变指针保存的地址所存储的值,而不是改变指针所保存的地址。就比如上面的swap_3()函数,它传入的是两个指针变量a,b。虽然在函数体执行过程中,函数体两个指针变量a,b的副本进行操作,但由于函数体内部将指针副本指向的内存空间所存储的值进行了交换,于是出了函数体后,虽然指针副本会消失,但原本两个指针p和q所指向的内存的值已经发生改变,故达到了交换的效果。
基于这个理解,我们来比较一下swap_1()和swap_2()函数的区别。swap_1()函数将a,b两个指针变量拷贝一个副本传入函数体中,并利用临时指针temp交换了这两个指针副本指向的位置。但是,要牢牢记住一点,交换指针副本不会对原来的指针产生影响!因此退出函数体后,p和q的指针没有发生任何变化。swap_2()函数与上一函数相比,多了一个指针的引用。而使用引用的最大好处,就是你在函数体中对指针变量的修改可以作用到原始变量p,q中,因此p,q指针所指向的地址已经发生了改变。
至此,问题解决。