C:函式交換兩個數,常見錯誤
函式交換兩個數,常見錯誤
問題:提供倆個數,利用函式實現交換。
出現的錯誤情況如下:
第一種情況:值傳遞;(如函式Swap_err01)
第二種情況:沒解引用;(如函式Swap_err02)
第三種情況:懸掛指標。(如函式Swap_err03)
能實現交換兩個數的函式,在函式Swap可以實現。
程式碼如下:
#include <stdio.h> void Swap_err01(int a,int b) { int tmp; tmp = a; a = b; b = tmp; } void Swap_err02(int *p1,int *p2) { int *tmp = p1; p1 = p2; p2 = tmp; } void Swap_err03(int *p1,int *p2) { int *tmp; *tmp = *p1; *p1 = *p2; *p2 = *tmp; } void Swap(int *p1,int *p2) { int tmp; tmp = *p1; *p1 = *p2; *p2 = tmp; } int main () { int a=10; int b=20; printf("a=%d,b=%d\n",a,b); //Swap_err01(a,b); //Swap_err02(&a,&b); //Swap_err03(&a,&b); Swap(&a,&b); printf("a=%d,b=%d\n",a,b); return 0; }
編譯結果如下:
函式Swap_err01的編譯結果:
由結果可見,按值傳遞,不能達到交換兩個數。按值傳遞: 函式內部使用的引數稱為形參,是通過拷貝實參而來,從而對其進行修改,所以,對原來的實參不會造成修改。 如下圖所示,內部變數互不影響。
函式Swap_err02的編譯結果:
由結果可見,換位失敗,其主要原因就是因為沒有解引用,過程可看下圖。
函式Swap_err03的編譯結果:
由編譯結果可見,實行函式的時候,編譯器(Visual Studio 2012)報錯了,內容是變數tmp沒有被定義,其主要原因是,*tmp為懸掛指標(野指標),野指標:沒有訪問許可權的指標(地址)。
函式Swap的編譯結果:
由結果可見,實現了兩個數換位,解引用之後,將地址內的值換位。其過程如下圖:
注意:子函式的改變能影響到父函式,一定要傳指標和解引用,兩個條件缺一不可。
int main ()//父函式
{
Fun(&a,&b);//子函式
}