乙個函式中返回多個值

2021-06-22 03:09:33 字數 3398 閱讀 3553

如把多個需要返回的值作相應的處理後變成乙個可以用return

語句返回的資料,再在主調函式中拆開返回的資料使之變成幾個值。

那麼當我們希望從乙個函式中返回多個值時,用什麼方法去實現比較合理呢?

2方法1

:利用全域性變數

分析:全域性變數作為c

語言的乙個知識點,雖然我們都了解它的特點,但在實際教學過程中應用得並不是很多。由於全域性變數的作用域是從定義變數開始直到程式結束,而對於編寫有多個返回值的

c語言函式,我們可以考慮把要返回的多個值定義成全域性變數。當函式被呼叫時,全域性變數被更改,我們再把更改後的全域性變數值應用於主調函式中。函式被呼叫後被更改後的全域性變數值即為函式的數個返回值。下面以乙個例項演示該方法的應用。

例項1:編寫函式求

3個數中的最大值與最小值。

方法1:把最大值、最小值分別定義成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) /*

定義求最大最小值的函式

*/main()

除錯結果如下:

請輸入3

個整數:

5,-6,2

三個數中的最大值為:5;

最小值為

:-6注意:該方法雖然可以實現有多個返回值的函式,但由於全域性變數不能保證值的正確性(

因為其作用域是全域性,所以程式範圍內都可以修改它的值,如果出現錯誤將非常難以發現

),並且全域性變數增加了程式間模組的耦合,所以該方法要慎用。

方法2:傳遞陣列指標

我們知道c

語言函式引數的傳遞方式有值傳遞與位址傳遞。

當進行值傳遞時,主調函式把實參的值複製給形參,形參獲得從主調函式傳遞過來的值執行函式。在值傳遞過程中被調函式引數值的更改不能導致實參值的更改。

而如果是位址傳遞,由於傳遞過程中從實參傳遞過來的是位址,所以被調函式中形參值的更改會直接導致實參值的更改。因此,我們可以考慮把多個返回值作為陣列元素定義成乙個陣列的形式,並使該陣列的位址作為函式的形式引數,以傳址方式傳遞陣列引數。函式被呼叫後,形引數組元素改變導致實參改變,我們再從改變後的實參陣列元素中獲得函式的多個返回值。以下例項演示該方法的應用。

例項2:編寫函式求一維整形陣列的最大值與最小值,並把最大值與最小值返回給主調函式。

方法:以指標方式傳遞該一維陣列的位址,然後把陣列的最大值與陣列的第乙個元素交換,把陣列的最小值與最後乙個元素交換。函式被呼叫完畢後,實參陣列中的第一元素為陣列的最大值,實參陣列中最後乙個元素為陣列的最小值,從而實現返回陣列的最大值與最小值的功能。程式參考**如下:

#include "stdio.h"

void max_min(int *ptr,int n)

int i,j,k;

int temp;

for(i=1;i < n;i++)

if(*ptr<*(ptr+i))

k=i;

temp=*ptr;

*ptr=*(ptr+k);

*(ptr+k)=temp ;

for(i=0;i < n;i++)

if(*(ptr+n-1)>*(ptr+i))

j=i;

temp =*(ptr+n-1);

*(ptr+n-1)=*(ptr+j);

*(ptr+j)= temp ;

void main()

int a[6],i;

for(i=0;i<6;i++)

scanf("%d",&a[i]);

max_min(a,6);

printf("max=%d, min=%d\n",a[0],a[5]);

除錯結果如下:

請輸入6

個整形數

,以空格隔開

:5 8 9 32 -6 4

max=32,min=-6

注意:該方法適用於多個返回值的資料型別一致的情況。當返回值資料型別不一致時,不適用該方法。

陣列和指標的用法一致。例子如下:例項3

#include "stdio.h"

void max_min(int a,int n) /*定義求陣列最大值最小值的函式,傳遞陣列指標*/

int i,j,k;

for(i = 0; i < n-1; i++)

for(j = 0; j< n-i-1;j++)

if(a[i] > a[i+1])

k = a[i];

a[i] = a[i+1];

a[i+1] = k;

void main()

int a[6],i;

for(i=0;i<6;i++)

scanf("%d",&a[i]);

max_min(a,6);

printf("max=%d, min=%d\n",a[5],a[0]);

getch();

}方法3

:傳遞結構體指標

編寫返回多個值的c

語言函式,也可以考慮採用結構體的方式去實現。通過方法2

,我們知道如果返回的數個數值的資料型別不一致,可以通過定義全域性變數實現有多個返回值的

c語言函式,也可以考慮把要求返回的數個值定義成乙個結構體,然後同樣以

傳遞結構體指標方式把結構體的指標傳遞給形參結構體指標,那麼函式中對形參結構體的修改即是對實參結構體的修改,函式被呼叫後獲取的實參結構體成員即為函式的多個返回值,下面以例項演示該方法的應用。

例項4:編寫乙個使用者自定義函式,允許使用者錄入學生的基本資訊(

包括學號、姓名、所屬班級、總評成績

),並返回這些基本資訊給主調函式。

方法:把學生基本資訊定義成乙個結構體,在使用者自定義函式中傳遞該結構體的指標,則自定義函式中對結構體成員的錄入操作即是對實參結構體成員的錄入操作,從而實現多個返回值。參考**如下:

#include "stdio.h"

#include "conio.h"

struct inf;

main(void)

void ***x(struct inf *ptr)/*

該函式實現對結構體成員資料的錄入操作

*/除錯結果如下:

請輸入學號,姓名,

班別,總評成績

,以空格隔開

:200102lili200185

學號:200102,

姓名: 

lili,

班別:2001,

總評成績:

85注意:當函式要求返回的多個值是相互聯絡的或者返回的多個值資料型別不一致時可以採用該方法。

乙個函式返回多個值 C

1 2public void getvalues string userid,string password,outstring string username,outbool flag 313 else 1417 18 19private void btnlogin click object se...

怎樣從乙個函式返回多個值

函式都是單一返回值的,沒有多返回值的情況。如果說有的話,有以下兩種方法勉強可以說是多返回值的情況 1,返回乙個陣列。陣列可以儲存多個資料,從而實現多返回值情況。2,利用引用引數達到返回的效果。函式返回值設定成bool型用以表明函式的返回狀態,具體功能實現都用引用引數實現。個人推薦使用第二種方法,在p...

如何讓乙個函式返回多個值(C )

有兩種方法 1.使用指標變數宣告函式 或者使用陣列變數 2.使用傳出引數 第二種方法 我用例子說明。首先聲名乙個函式,定義如下 public bool checkuser string username,out string password,out int state else return fa...