1. 程式人生 > >C語言 指標應用-swap()

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交換,沒有問題。

/*那麼就到這裡了,

請繼續加油哦~*/