天天看點

第10章 指針(七) 應用1------函數間資料的雙向傳遞

  函數的參數不僅可以是整型、實型、字元型等資料,還可以是變量的指針,它将一個變量的首位址從主調函數傳送到另一個函數中,以間接的方式,實作了函數間資料的雙向傳遞。譚浩強先生用一個簡單的例子:輸入兩個整數,按大小順序輸出,用函數處理,說明了指針的這類應用。

1、【例】輸入的兩個整數按大小順序輸出, 用函數處理,而且用指針類型的資料作函數參數。

swap(int *p1,int *p2)

{

   int temp;

   temp=*p1;

   *p1=*p2;

   *p2=temp;

}

main() {

int a,b;

    int *pointer_1,*pointer_2;

    scanf("%d,%d",&a,&b);

    pointer_1=&a;pointer_2=&b;

    if(a<b)

          swap(pointer_1,pointer_2);

    printf("/n%d,%d/n",a,b);

對程式的說明:

       swap是使用者定義的函數,它的作用是交換兩個變量(a和b)的值。swap函數的形參p1、p2是指針變量。程式運作時,先執行main函數,輸入a和b的值。然後将a和b的位址分别賦給指針變量pointer_1和pointer_2,使pointer_1指向a,pointer_2指向b。

      接着執行if語句,由于a〈b,是以執行swap函數。注意實參pointer_1和pointer_2是指針變量,在函數調用時,将實參變量的值傳遞給形參變量。采取的依然是“值傳遞”方式。是以虛實結合後形參p1的值為&a,p2的值為&b。這時p1和pointer_1指向變量a,p2和pointer_2指向變量b。

      接着執行執行swap函數的函數體使*p1和*p2的值互換,也就是使a和b的值互換。

函數調用結束後,p1和p2不複存在(已釋放)如圖。

最後在main函數中輸出的a和b的值是已經過交換的值。

進一步分析如下:

       表面上看,由于a和b是main()的局部變量,他們的作用域就是main()的函數體,是以a,b對于swap()是不可見的,即swap()不能對a和b指派,也不能使用a和b中的資料進行運算;

       但是,當我們通過使用指針參數pointer1和pointer2,将&a、&b這2個位址從main()傳入了swap();那麼,swap()通過該位址,就可以找到main()的a,b,進而使得swap()就象main()一樣,可以直接對a、b指派,或直接用a、b中的值進行運算。

       這樣一來,主調函數main()可以存取a、b,而被調函數swap()通過傳入的位址,也可以存取a、b。我們說a、b在main()和swap()間被共享了。

       既然變量都被共享了,那麼main()就可以通過a、b給swap()傳送資料;同理swap()也可以通過a、b給main()傳送資料了,這就是說,我們實作了這2個函數間的雙向資料傳遞。

       恰可謂明修棧道,暗渡陳倉!!!

2、請注意交換*p1和*p2的值是如何實作的。請找出下列程式段的錯誤:

{int *temp;

*temp=*p1;      /*此語句有問題*/

*p1=*p2;

*p2=temp;

       上面的錯誤在于int *temp是一個野指針!!!當你定義了一個指針A,但是沒有明确指定A指向哪個變量,那麼A就叫野指針;

       一定要給你的指針變量賦初值,不要讓他成為野指針,否則他會桀骜不馴,成為一個很危險的東西。

       遙想當年,他搞死過我的程式,也使我的系統死過機,甚至摧毀了我的作業系統.......;你要格外小心,不要讓世界末日降臨。

3、請考慮下面的函數能否實作實作a和b互換。

swap(int x,int y)

{int temp;

temp=x;

x=y;

y=temp;

如果在main函數中用“swap(a,b);”調用swap函數,會有什麼結果呢?請看下圖所示。

上面的分析,再次驗證了函數參數的單向值傳遞原則!!!

4、【例】請注意,不能企圖通過改變指針形參的值而使指針實參的值改變。

{int *p;

p=p1;

p1=p2;

p2=p;

main()

int *pointer_1,*pointer_2;

    if(a<b) swap(pointer_1,pointer_2);

         printf("/n%d,%d/n",*pointer_1,*pointer_2);

其中的問題在于不能實作如圖所示的第四步(d)。

       函數使用指針作為參數時,作為函數參數的一種,指針參數仍然也必須遵守單向值傳遞的原則,即指針參數中位址在被調函數中的改變,不會傳回到主調函數

第10章 指針(七) 應用1------函數間資料的雙向傳遞
第10章 指針(七) 應用1------函數間資料的雙向傳遞
第10章 指針(七) 應用1------函數間資料的雙向傳遞
第10章 指針(七) 應用1------函數間資料的雙向傳遞
第10章 指針(七) 應用1------函數間資料的雙向傳遞
第10章 指針(七) 應用1------函數間資料的雙向傳遞

本文轉自yonghu86 51CTO部落格,原文連結:http://blog.51cto.com/yonghu/1321420,如需轉載請自行聯系原作者

繼續閱讀