1. 程式人生 > >關於用指標交換兩個數

關於用指標交換兩個數

關於用指標交換兩個數

西郵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 我相信也只是不在話下的,一秒鐘就看穿它的本質就把它幹掉了。

----- 完