關於用指標交換兩個數
關於用指標交換兩個數
西郵Linux 興趣小組又到了納新季,作為一個老學長,面試學弟學妹們的時候,必然要然他們感受到小組的關懷(受盡折磨),這一屆孩子還是挺強的,但是一到指標上就栽了坑,在加上我們小組的陳年老題swap屢試不爽。所以在這裡總結一下關於用一級 二級指標交換兩個數字的問題。
一級指標交換
#include<stdio.h>
int swap(int *c , int *d)
{
int *q;
q = c;
c = d;
d = q;
printf("%d %d\n", *c, *d);
}
int main ()
{
int a=5, b=10;
swap(&a, &b);
printf("%d %d\n" , a, b);
return 0;
}
/*
這個得出結果是
10 5
5 10
*/
由結果來看的話,是在 swap 裡邊是交換成功了的。
這個原因是因為主函式呼叫 swap(c,d); 之後這個函式在棧上開闢了一段空間,形式引數(int *a, int *b) 是將原來主函式的(&a, &b) 完全的拷貝了一份,裡邊儲存的是主函式的 a,b 的地址然後定義一箇中間指標變數,進行交換,此時形參 c, d 內部儲存的地址值確實發生了交換,以至於*c ,*d 的值確實是10, 5; 但是並未對主函式中資料塊a,b 產生任何影響。當swap列印完畢之後,此函式生命週期結束,int *c , int *d 被釋放掉。 然後回到主函式裡,由於資料塊 a, b並沒有 發生任何改變所以打印出來的值才會發生沒有交換。
敲黑板!!!
所以呢我們由此得出結論我們應該實實在在的交換資料塊 a,b 才能成功
本著這個想法我們做出瞭如下改變。
#include<stdio.h>
int swap(int *c , int *d)
{
int q;
q = *c;
*c = *d;
*d = q;
printf("%d %d\n", *c, *d);
}
int main ()
{
int a=5, b=10;
swap(&a, &b);
printf("%d %d\n" , a, b);
return 0;
}
/*
這個得出結果是
10 5
10 5
*/
二級指標交換
這個在主函式禮拜呢呼叫swap(&a, &b);之後 在swap函式中 , 用*c, *d ,去直接訪問了a ,b 所在的資料 並把他們交換, 這樣在swap生命週期結束之後, main 函式 資料塊a,b 中的值發生了交換最後的結果就是被改變了的。
所以本著這樣的想法,那麼我們就由這個形參 (int **c, int ** d) 把他們降級兩次就可訪問到資料塊a,b。再對它進行交換即可。
#include<stdio.h>
int swap(int **a , int **b)
{
int q;
q = **a;
**a = **b;
**b = q;
printf("%d %d",**a,**b);
}
int main ()
{
int a=3, b=8;
int *p = &a,*q = &b;
swap(&p , &q);
printf("%d %d", a ,b);
}
/*
這個得出結果是
10 5
10 5
*/
如果以上的兩個指標交換理解了,那麼就算學長再為難你們 出一個 int *************************b, 或者 int ***********************************************************************************************b 我相信也只是不在話下的,一秒鐘就看穿它的本質就把它幹掉了。
----- 完