C语言 指针应用-swap()

补充:

swap仍然是开了一个新的空间,只是这个空间的特点与他的参数类型有关。

因此,对于swap(int*a,int*b){int *temp;...}不成功。

swap(int*a,int*b){int temp;...}成功。


-------------------------------------------------------------------------------------------------

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交换,没有问题。

 

/*那么就到这里了,

请继续加油哦~*/



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值