不能直接返回一個數組,但是可以用其他方式實現類似功能。方法1:利用全域性變數 分析:全域性變數作為C語言的一個知識點,雖然我們都瞭解它的特點,但在實際教學過程中應用得並不是很多。由於全域性變數的作用域是從定義變數開始直到程式結束,而對於編寫有多個返回值的C語言函式,我們可以考慮把要返回的多個值定義成全域性變數。當函式被呼叫時,全域性變數被更改,我們再把更改後的全域性變數值應用於主調函式中。函式被呼叫後被更改後的全域性變數值即為函式的數個返回值。下面以一個例項演示該方法的應用。 例項1:編寫函式求3個數中的最大值與最小值。 方法:把最大值、最小值分別定義成2個全域性變數max、min,在使用者自定義函式中把求出來的最大值與最小值分別賦給全域性變數max、min。函式呼叫完畢後全域性變數的max、min值即儲存了函式要求返回的值。程式參考程式碼如下: #include "stdio.h" #include "conio.h" int max,min;/*定義兩個全域性變數用於儲存函式返回值*/ void max_min(int a,int b,int c) /*定義求最大最小值的函式*/ {max=min=a; /*初始化最大最小值*/ if(max if(max if(min>b)min=b; if(min>c)min=c; } main() {int x,y,z; printf(" 請輸入3個整數:\n"); scanf("%d,%d,%d",&x,&y,&z); max_min(x,y,z) ;/*呼叫求最大值與最小值的函式*/ printf("三個數中的最大值為:%d;最小值為:%d",max,min);/*輸出最大值與最小值*/ getch(); } 除錯結果如下: 請輸入3個整數: 5,-6,2 三個數中的最大值為:5;最小值為:-6 注意:該方法雖然可以實現有多個返回值的函式,但由於全域性變數不能保證值的正確性(因為其作用域是全域性,所以程式範圍內都可以修改它的值,如果出現錯誤將非常難以發現),並且全域性變數增加了程式間模組的耦合,所以該方法要慎用。 方法2:傳遞陣列指標 分析:在教學過程中,我們知道C語言函式引數的傳遞方式有值傳遞與地址傳遞。當進行值傳遞時,主調函式把實參的值複製給形參,形參獲得從主調函式傳遞過來的值執行函式。在值傳遞過程中被調函式引數值的更改不能導致實參值的更改。而如果是地址傳遞,由於傳遞過程中從實參傳遞過來的是地址,所以被調函式中形參值的更改會直接導致實參值的更改。因此,我們可以考慮把多個返回值作為陣列元素定義成一個數組的形式,並使該陣列的地址作為函式的形式引數,以傳址方式傳遞陣列引數。函式被呼叫後,形引數組元素改變導致實參改變,我們再從改變後的實引數組元素中獲得函式的多個返回值。以下例項演示該方法的應用。 例項2:編寫函式求一維整形陣列的最大值與最小值,並把最大值與最小值返回給主調函式。 方法:以指標方式傳遞該一維陣列的地址,然後把陣列的最大值與陣列的第一個元素交換,把陣列的最小值與最後一個元素交換。函式被呼叫完畢後,實引數組中的第一元素為陣列的最大值,實引數組中最後一個元素為陣列的最小值,從而實現返回陣列的最大值與最小值的功能。程式參考程式碼如下: #include "stdio.h" #include "conio.h" void max_min(int *ptr,int n) /*定義求陣列最大值最小值的函式,傳遞陣列指標*/ {int i,j,k;/*j儲存最大值所在位置,k儲存最小值所在位置*/ int *temp;/*用於交換位置*/ *temp=*ptr; for(i=0;i { if(*ptr*(ptr+i))/*最小值與最後一個元素進行交換*/ { j=i; *temp =*(ptr+n-1); *(ptr+n-1)=*(ptr+j); *(ptr+j)= *temp ;} } } /*呼叫最大最小值函式*/ main() { int A[6],i; for(i=0;i
不能直接返回一個數組,但是可以用其他方式實現類似功能。方法1:利用全域性變數 分析:全域性變數作為C語言的一個知識點,雖然我們都瞭解它的特點,但在實際教學過程中應用得並不是很多。由於全域性變數的作用域是從定義變數開始直到程式結束,而對於編寫有多個返回值的C語言函式,我們可以考慮把要返回的多個值定義成全域性變數。當函式被呼叫時,全域性變數被更改,我們再把更改後的全域性變數值應用於主調函式中。函式被呼叫後被更改後的全域性變數值即為函式的數個返回值。下面以一個例項演示該方法的應用。 例項1:編寫函式求3個數中的最大值與最小值。 方法:把最大值、最小值分別定義成2個全域性變數max、min,在使用者自定義函式中把求出來的最大值與最小值分別賦給全域性變數max、min。函式呼叫完畢後全域性變數的max、min值即儲存了函式要求返回的值。程式參考程式碼如下: #include "stdio.h" #include "conio.h" int max,min;/*定義兩個全域性變數用於儲存函式返回值*/ void max_min(int a,int b,int c) /*定義求最大最小值的函式*/ {max=min=a; /*初始化最大最小值*/ if(max if(max if(min>b)min=b; if(min>c)min=c; } main() {int x,y,z; printf(" 請輸入3個整數:\n"); scanf("%d,%d,%d",&x,&y,&z); max_min(x,y,z) ;/*呼叫求最大值與最小值的函式*/ printf("三個數中的最大值為:%d;最小值為:%d",max,min);/*輸出最大值與最小值*/ getch(); } 除錯結果如下: 請輸入3個整數: 5,-6,2 三個數中的最大值為:5;最小值為:-6 注意:該方法雖然可以實現有多個返回值的函式,但由於全域性變數不能保證值的正確性(因為其作用域是全域性,所以程式範圍內都可以修改它的值,如果出現錯誤將非常難以發現),並且全域性變數增加了程式間模組的耦合,所以該方法要慎用。 方法2:傳遞陣列指標 分析:在教學過程中,我們知道C語言函式引數的傳遞方式有值傳遞與地址傳遞。當進行值傳遞時,主調函式把實參的值複製給形參,形參獲得從主調函式傳遞過來的值執行函式。在值傳遞過程中被調函式引數值的更改不能導致實參值的更改。而如果是地址傳遞,由於傳遞過程中從實參傳遞過來的是地址,所以被調函式中形參值的更改會直接導致實參值的更改。因此,我們可以考慮把多個返回值作為陣列元素定義成一個數組的形式,並使該陣列的地址作為函式的形式引數,以傳址方式傳遞陣列引數。函式被呼叫後,形引數組元素改變導致實參改變,我們再從改變後的實引數組元素中獲得函式的多個返回值。以下例項演示該方法的應用。 例項2:編寫函式求一維整形陣列的最大值與最小值,並把最大值與最小值返回給主調函式。 方法:以指標方式傳遞該一維陣列的地址,然後把陣列的最大值與陣列的第一個元素交換,把陣列的最小值與最後一個元素交換。函式被呼叫完畢後,實引數組中的第一元素為陣列的最大值,實引數組中最後一個元素為陣列的最小值,從而實現返回陣列的最大值與最小值的功能。程式參考程式碼如下: #include "stdio.h" #include "conio.h" void max_min(int *ptr,int n) /*定義求陣列最大值最小值的函式,傳遞陣列指標*/ {int i,j,k;/*j儲存最大值所在位置,k儲存最小值所在位置*/ int *temp;/*用於交換位置*/ *temp=*ptr; for(i=0;i { if(*ptr*(ptr+i))/*最小值與最後一個元素進行交換*/ { j=i; *temp =*(ptr+n-1); *(ptr+n-1)=*(ptr+j); *(ptr+j)= *temp ;} } } /*呼叫最大最小值函式*/ main() { int A[6],i; for(i=0;i