C語言 指標應用-swap()
阿新 • • 發佈:2019-02-05
補充:
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交換,沒有問題。
/*那麼就到這裡了,
請繼續加油哦~*/