补充:
-------------------------------------------------------------------------------------------------
1. 不使用指针来做swap处理
举个swap(int,int)的粒子
#include<stdio.h>
void swap(int,int);
int main(){
int a=1,b=2;
swap(a,b);
return 0;
}
void swap(int c,int d){
int temp;
temp=c;
c=d;
d=temp;
}
对于这个swap,a,b的值不会发生变化。可以将这个过程理解成,在一个崭新的swap空间中,创建了创建了两个新的点c,d然后将他们的值赋成和a,b相同的数。当在swap空间中进行交换后,离开了这个空间,回到了main空间,然后swap空间被释放,于是c,d,temp三者全部消失。整个过程中没有对main空间中的a,b进行任何操作。
那么当使用指针来进行swap处理会有什么区别?
2. 使用指针对a,b进行swap
举个粒子
#include<stdio.h>
void swap(int*,int*);
int main(){
int a=1,b=2;
int*pa,*pb;
pa=&a;pb=&b;
swap(pa,pb);
return 0;
}
void swap(int*p1 ,int *p2){
int temp;
temp=*p1;//【1】
*p1=*p2 ;
*p2=temp ;
}
因为地址的唯一性,所以在这个swap函数中,指针p1和指针pa相同,指针p2和指针pb相同。也因此,在【1】部分起的代码中,回直接导致a,b的内容进行交换。
3. 使用指针swap指针所指的内容,但是不改变a,b
在2中,为了改变a,b,将指向他们的指针传入swap方程。
在这里,为了改变指向他们的指针pa,pb,则需要将指向 【指向他们的指针(pa,pb)】 的指针(ppa,ppb)传入swap。得到:
#include<stdio.h>
void swap(int**,int**);//【3】
int main(){
int a=1,b=2;
int*pa,*pb;
pa=&a;pb=&b;
int**ppa,**ppb; //【3】
ppa=&pa;ppb=&pb;
swap(ppa,ppb); //【2】
return 0;
}
void swap(int**p1 ,int **p2){//【3】
int* temp;//[1]
temp=*p1;//
*p1=*p2 ;
*p2=temp ;
}
【1】 在这里,temp的类型为int*,是一个指向int类型的指针。这是因为,temp的类型需要和*p1,*p2保持一致。
【2】 感谢智慧的C,我们可以非常幸运地不用再设置一个指向pa的ppa,而是可以直接将这一行写作“swap(&pa,&pb);”。如果用我们的向量理论来解释,那便是我们说的“&X”表示指向X的地址的向量,无论X是什么类型。
【3】 因为ppa与ppb,以及p1和p2是【指向指针】的指针,因此,他们的数据类型应该是int**,对于swap中的参数类型,亦是如此。但是,感谢智慧的C,如果在这里写成了int *也没有关系。
4. 直接使用地址&代替指针进行swap
我们发现,可以直接利用地址来传入swap进行交换,因此会变成:
#include<stdio.h>
void swap(int*,int*);
int main(){
int a=1,b=2;
swap(&a,&b);
printf("%d;%d",a,b);
return 0;
}
void swap(int*p1 ,int *p2){
int temp;
temp=*p1;//【1】
*p1=*p2 ;
*p2=temp ;
}
得到a,b交换,没有问题。
/*那么就到这里了,
请继续加油哦~*/