c語言函數(shù)返回多個值 c語言中函數(shù)返回多個值

c語言一個函數(shù)返回多個值

在C語言中,一般情況下函數(shù)的返回值是通過函數(shù)中的return語句來實(shí)現(xiàn)的,每調(diào)用一次return語句只能從函數(shù)中返回一個值。但在實(shí)際很多應(yīng)用中,我們需要從函數(shù)中返回多個值,那我們可以用什么方法實(shí)現(xiàn)呢?此時我們可以用三種方法來實(shí)現(xiàn)。

創(chuàng)新互聯(lián)主要從事成都做網(wǎng)站、網(wǎng)站建設(shè)、外貿(mào)營銷網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)港北,十余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):13518219792

方法一:設(shè)置全局變量

全局變量是在函數(shù)外部定義的全局變量,它不屬于任何一個函數(shù),其作用域是從變量的定義處開始,到本程序文件的結(jié)尾。在此作用域內(nèi),全局變量可為各個函數(shù)所引用。當(dāng)我們需要函數(shù)返回多個值時,除了函數(shù)體中的return語句返回其中一個之外,其它的返回值我們可以通過定義全局變量來處理。因?yàn)楦鶕?jù)全局變量的特點(diǎn),在被調(diào)用函數(shù)中改變了多個全局變量和值,相當(dāng)于其主調(diào)函數(shù)全局變量的值也發(fā)生了變化,也就相當(dāng)于返回了多個值。

例如:利用一個函數(shù)求出正方形的周長和面積。

#include

double l=0;//定義全局變量l為正方形周長

void f(double a)//定義求面積和周長的函數(shù)

{ double s; s=a*a;//求面積

l=6*a;//求周長,并賦給全局變量l

return s;//僅返回面積的值

}

void main()

{ double a,area;

printf(“請輸入邊長:");

scanf("%f",a);

area=f(a);//面積的值通過調(diào)用f函數(shù)返回值

printf(“面積為:%5.2lf\n”,area);

printf(“周長為:%5.2lf\n”,l);//周長即為全局變量l在f函數(shù)中改變后的值

}

上面的例子即用全局變量實(shí)現(xiàn)了函數(shù)中返回多值的情況,這種方式易懂。但是全局變量用多了會破壞代碼的安全性,結(jié)構(gòu)性,這主要是全局變量在所有函數(shù)中都可以使用,從而其值的變化不確定,所以我們要慎用。

方法二:使用數(shù)組名或指針作為函數(shù)的形參

數(shù)組名或者指針實(shí)際為地址,而數(shù)組一般都包括多個元素,指針也可以指向一組數(shù)據(jù)的著地址,把數(shù)組名或者指針作為函數(shù)形參,實(shí)際上相當(dāng)于主調(diào)函數(shù)的實(shí)參與形參共用地址,所以在函數(shù)中的數(shù)組元素發(fā)生改變即是實(shí)參也隨之改變。也相當(dāng)于在調(diào)用函數(shù)時多個值返回給主調(diào)函數(shù)。

實(shí)例2:編寫函數(shù)求一維整形數(shù)組的最大值與最小值,并把最大值與最小值返回給主調(diào)函數(shù)。

方法:以指針方式傳遞該一維數(shù)組的地址,然后把數(shù)組的最大值與數(shù)組的第一個元素交換,把數(shù)組的最小值與最后一個元素交換。函數(shù)被調(diào)用完畢后,實(shí)參數(shù)組中的第一元素為數(shù)組的最大值,實(shí)參數(shù)組中最后一個元素為數(shù)組的最小值,從而實(shí)現(xiàn)返回?cái)?shù)組的最大值與最小值的功能。程序參考代碼如下:

#include "stdio.h"

#include "conio.h"

void max_min(int *ptr,int n) /*定義求數(shù)組最大值最小值的函數(shù),傳遞數(shù)組指針*/

{int i,j,k;/*j保存最大值所在位置,k保存最小值所在位置*/

int *temp;/*用于交換位置*/

*temp=*ptr;

for(i=0;i{

if(*ptr*(ptr+i))/*最大值與第一個元素進(jìn)行交換*/

{

k=i;

*temp=*ptr;

*ptr=*(ptr+k);

*(ptr+k)=*temp ;

}

if(*(ptr+n-1)*(ptr+i))/*最小值與最后一個元素進(jìn)行交換*/

{

j=i;

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

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

*(ptr+j)= *temp ;}

}

}

/*調(diào)用最大最小值函數(shù)*/

main()

{

int A[6],i;

for(i=0;i6;i++)

scanf("%d",A[i]);

max_min(A,6);

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

getch();

}

調(diào)試結(jié)果如下:

請輸入6個整形數(shù),以空格隔開:

5 8 9 32 -6 4

max=32,min=-6

注意:該方法適用于多個返回值的數(shù)據(jù)類型一致的情況。當(dāng)返回值數(shù)據(jù)類型不一致時,不適用該方法。

方法三:使用結(jié)構(gòu)體指針作為函數(shù)的形參

編寫返回多個值的C語言函數(shù),可以考慮采用結(jié)構(gòu)體的方式去實(shí)現(xiàn)。如果返回的數(shù)個數(shù)值的數(shù)據(jù)類型不一致,可以通過定義全局變量實(shí)現(xiàn)有多個返回值的C語言函數(shù),也可以考慮把要求返回的數(shù)個值定義成一個結(jié)構(gòu)體,然后同樣以傳遞結(jié)構(gòu)體指針方式把結(jié)構(gòu)體的指針傳遞給形參結(jié)構(gòu)體指針,那么函數(shù)中對形參結(jié)構(gòu)體的修改即是對實(shí)參結(jié)構(gòu)體的修改,函數(shù)被調(diào)用后獲取的實(shí)參結(jié)構(gòu)體成員即為函數(shù)的多個返回值,下面以實(shí)例演示該方法的應(yīng)用。

實(shí)例3:編寫一個用戶自定義函數(shù),允許用戶錄入學(xué)生的基本信息(包括學(xué)號、姓名、所屬班級、總評成績),并返回這些基本信息給主調(diào)函數(shù)。

 方法:把學(xué)生基本信息定義成一個結(jié)構(gòu)體,在用戶自定義函數(shù)中傳遞該結(jié)構(gòu)體的指針,則自定義函數(shù)中對結(jié)構(gòu)體成員的錄入操作即是對實(shí)參結(jié)構(gòu)體成員的錄入操作,從而實(shí)現(xiàn)多個返回值。參考代碼如下:

#include "stdio.h"

#include "conio.h"

struct inf{/*定義學(xué)生結(jié)構(gòu)體,分別包含成員學(xué)號、姓名、班別、總評成績*/

char xh[12];

char name[20];

char class[15];

int chj;

};

main(void)

{

struct inf a1; /*定義學(xué)生結(jié)構(gòu)體類型變量*/

void xxxx(struct inf *ptr);

printf("請輸入學(xué)號,姓名,班別,總評成績,以空格隔開:\n") ;

xxxx(a1);/*調(diào)用函數(shù),以學(xué)生結(jié)構(gòu)體類型變量地址作為實(shí)參*/

printf("學(xué)號:%s,姓名: %s,班別:%s,總評成績:%d",a1.xh, a1.name,a1.class,a1.chj);

getch();

}

void xxxx(struct inf *ptr)/*該函數(shù)實(shí)現(xiàn)對結(jié)構(gòu)體成員數(shù)據(jù)的錄入操作*/

{

char xh1[12],name1[20],class1[15];

int chj1;

scanf("%s%s%s%d",xh1,name1,class1,chj1);

strcpy(ptr-xh,xh1);

strcpy(ptr-name,name1);

strcpy(ptr-class,class1);

ptr-chj=chj1;

}

調(diào)試結(jié)果如下:

請輸入學(xué)號,姓名,班別,總評成績,以空格隔開:

200102LiLi200185

學(xué)號:200102,姓名: LiLi,班別:2001,總評成績:85

注意:當(dāng)函數(shù)要求返回的多個值是相互聯(lián)系的或者返回的多個值數(shù)據(jù)類型不一致時可以采用該方法。

結(jié)束語

對于以上這三種方法,如果想要返回的數(shù)個值數(shù)據(jù)類型一致,可以考慮采用方法2;而對于不同數(shù)據(jù)類型的返回值,如果各個數(shù)值之間是相互聯(lián)系的,則方法3較為合適;方法1雖然在很多情況下都可以實(shí)現(xiàn)多個返回值的C語言函數(shù),但畢竟全局變量應(yīng)用過程中有很多危險(xiǎn),要慎重使用。

通過對以上幾種方法的分析講解,在教學(xué)過程中,學(xué)生再遇到這樣的問題時,就能根據(jù)返回值的情況選擇合適的途徑去實(shí)現(xiàn)多個返回值的C語言函數(shù)。另外,如果再遇到類似的無法用教材知識點(diǎn)去直接解決的問題時,他們基本都能舉一反三地嘗試采用間接方式去解決。

參考材料:

c語言中調(diào)用函數(shù)如何返回多個值?

主要可以通過指針或數(shù)組返回多個值,測試代碼如下,

//程序功能,通過結(jié)構(gòu)體實(shí)現(xiàn)多個數(shù)據(jù)返回及通過多個變量指針實(shí)現(xiàn)

#include

stdio.h

#include

stdlib.h

#include

string.h

#define

PI

3.1415926

struct

test

{

int

x;

char

str[20];

};

//返回結(jié)構(gòu)體,實(shí)現(xiàn)多個數(shù)據(jù)返回

struct

test*

getTest()

{

struct

test

*t=NULL;

t=(struct

test*)malloc(sizeof(struct

test));

if(!t)

return

NULL;

t-x=10;

memset(t-str,0,20);

memcpy(t-str,"testinfo",8);

return

t;

}

//變相返回圓的面積、周長

void

cir(double

r,double

*area,double

*girth)

{

*area=PI*r*r;

*girth=PI*r*2;

}

int

main(int

argc,

char

*argv[])

{

double

r=10.2;

double

s=0,g=0;

struct

test

*t1=getTest();

if(!t1)

return

1;

cir(r,s,g);

printf("area=%f,girth=%f\n",s,g);

printf("%d,%s\n",t1-x,t1-str);

if(t1)

{

free(t1);

t1=NULL;

}

return

0;

}

c語言函數(shù)名義上函數(shù)返回值只能有一個變量或者無返回值,但返回的變量可以是指針或結(jié)構(gòu)體等更復(fù)雜的數(shù)據(jù),通過指針或結(jié)構(gòu)體從而變相實(shí)現(xiàn)多參數(shù)返回??梢宰鳛閷?shí)參間接返回或直接作為返回值返回,但需注意不要返回臨時變量,如getTest()函數(shù)中不能定義struct

test

t變量直接返回。

C語言中一個函數(shù)怎樣返回多個值

方法一:設(shè)置全局變量,這樣你在形參中改變?nèi)肿兞?,在?shí)參中也會有效。所以你可以在形參中改變多個全局變量的值,那么在實(shí)參中就相當(dāng)于返回多個值。

方法二:如果你用數(shù)組名作為形參,那么你改變數(shù)組內(nèi)容,比如排序,或者進(jìn)行加減運(yùn)算,回到實(shí)參時依然是有效的。這樣也會返回一組值。

方法三:可以利用指針變量,這個原理和方法二是一樣的,因?yàn)閿?shù)組名本身就是數(shù)組首元素的地址。就不多說了。

方法四:如果你學(xué)過C++,可以引用參數(shù)

C語言返回多個值的方法

導(dǎo)語:編寫有多個返回值的函數(shù)是所有C語言教材里均沒有提到的知識點(diǎn),但在實(shí)際教學(xué)與應(yīng)用的過程中我們都有可能會遇到這樣的問題。以下是引導(dǎo)學(xué)生采用的三種不同方法編寫多個返回值的C語言函數(shù),一起來學(xué)習(xí)下吧:

   方法1:利用全局變量

分析:全局變量作為C語言的一個知識點(diǎn),雖然我們都了解它的特點(diǎn),但在實(shí)際教學(xué)過程中應(yīng)用得并不是很多。由于全局變量的作用域是從定義變量開始直到程序結(jié)束,而對于編寫有多個返回值的C語言函數(shù),我們可以考慮把要返回的多個值定義成全局變量。當(dāng)函數(shù)被調(diào)用時,全局變量被更改,我們再把更改后的全局變量值應(yīng)用于主調(diào)函數(shù)中。函數(shù)被調(diào)用后被更改后的全局變量值即為函數(shù)的數(shù)個返回值。下面以一個實(shí)例演示該方法的應(yīng)用。

實(shí)例1:編寫函數(shù)求3個數(shù)中的最大值與最小值。

方法:把最大值、最小值分別定義成2個全局變量max、min,在用戶自定義函數(shù)中把求出來的最大值與最小值分別賦給全局變量max、min。函數(shù)調(diào)用完畢后全局變量的max、min值即保存了函數(shù)要求返回的值。程序參考代碼如下:

#include "stdio.h"

#include "conio.h"

int max,min;/*定義兩個全局變量用于保存函數(shù)返回值*/

void max_min(int a,int b,int c) /*定義求最大最小值的函數(shù)*/

{max=min=a; /*初始化最大最小值*/

if(max if(max if(minb)min=b;

if(minc)min=c;

}

main()

{int x,y,z;

printf(" 請輸入3個整數(shù): ");

scanf("%d,%d,%d",x,y,z);

max_min(x,y,z) ;/*調(diào)用求最大值與最小值的函數(shù)*/

printf("三個數(shù)中的最大值為:%d;最小值為:%d",max,min);/*輸出最大值與最小值*/

getch();

}

調(diào)試結(jié)果如下:

請輸入3個整數(shù):

5,-6,2

三個數(shù)中的最大值為:5;最小值為:-6

注意:該方法雖然可以實(shí)現(xiàn)有多個返回值的函數(shù),但由于全局變量不能保證值的正確性(因?yàn)槠渥饔糜蚴侨?,所以程序范圍?nèi)都可以修改它的值,如果出現(xiàn)錯誤將非常難以發(fā)現(xiàn)),并且全局變量增加了程序間模塊的耦合,所以該方法要慎用。

   方法2:傳遞數(shù)組指針

分析:在教學(xué)過程中,我們知道C語言函數(shù)參數(shù)的傳遞方式有值傳遞與地址傳遞。當(dāng)進(jìn)行值傳遞時,主調(diào)函數(shù)把實(shí)參的值復(fù)制給形參,形參獲得從主調(diào)函數(shù)傳遞過來的值運(yùn)行函數(shù)。在值傳遞過程中被調(diào)函數(shù)參數(shù)值的更改不能導(dǎo)致實(shí)參值的更改。而如果是地址傳遞,由于傳遞過程中從實(shí)參傳遞過來的是地址,所以被調(diào)函數(shù)中形參值的更改會直接導(dǎo)致實(shí)參值的更改。因此,我們可以考慮把多個返回值作為數(shù)組元素定義成一個數(shù)組的形式,并使該數(shù)組的地址作為函數(shù)的形式參數(shù),以傳址方式傳遞數(shù)組參數(shù)。函數(shù)被調(diào)用后,形參數(shù)組元素改變導(dǎo)致實(shí)參改變,我們再從改變后的實(shí)參數(shù)組元素中獲得函數(shù)的多個返回值。以下實(shí)例演示該方法的應(yīng)用。

實(shí)例2:編寫函數(shù)求一維整形數(shù)組的最大值與最小值,并把最大值與最小值返回給主調(diào)函數(shù)。

方法:以指針方式傳遞該一維數(shù)組的地址,然后把數(shù)組的最大值與數(shù)組的'第一個元素交換,把數(shù)組的最小值與最后一個元素交換。函數(shù)被調(diào)用完畢后,實(shí)參數(shù)組中的第一元素為數(shù)組的最大值,實(shí)參數(shù)組中最后一個元素為數(shù)組的最小值,從而實(shí)現(xiàn)返回?cái)?shù)組的最大值與最小值的功能。程序參考代碼如下:

#include "stdio.h"

#include "conio.h"

void max_min(int *ptr,int n) /*定義求數(shù)組最大值最小值的函數(shù),傳遞數(shù)組指針*/

{int i,j,k;/*j保存最大值所在位置,k保存最小值所在位置*/

int *temp;/*用于交換位置*/

*temp=*ptr;

for(i=0;i{

if(*ptr*(ptr+i))/*最大值與第一個元素進(jìn)行交換*/

{

k=i;

*temp=*ptr;

*ptr=*(ptr+k);

*(ptr+k)=*temp ;

}

if(*(ptr+n-1)*(ptr+i))/*最小值與最后一個元素進(jìn)行交換*/

{

j=i;

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

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

*(ptr+j)= *temp ;}

}

}

/*調(diào)用最大最小值函數(shù)*/

main()

{

int A[6],i;

for(i=0;i6;i++)

scanf("%d",A[i]);

max_min(A,6);

printf("max=%d, min=%d ",A[0],A[5]);

getch();

}

調(diào)試結(jié)果如下:

請輸入6個整形數(shù),以空格隔開:

5 8 9 32 -6 4

max=32,min=-6

注意:該方法適用于多個返回值的數(shù)據(jù)類型一致的情況。當(dāng)返回值數(shù)據(jù)類型不一致時,不適用該方法。

方法3:傳遞結(jié)構(gòu)體指針

分析:結(jié)構(gòu)體作為教學(xué)中的一個難點(diǎn),教材對它介紹的內(nèi)容并不多,應(yīng)用的實(shí)例更是少之又少,所以學(xué)生對于結(jié)構(gòu)體普遍掌握情況不理想。其實(shí),編寫返回多個值的C語言函數(shù),也可以考慮采用結(jié)構(gòu)體的方式去實(shí)現(xiàn)。通過方法2,我們知道如果返回的數(shù)個數(shù)值的數(shù)據(jù)類型不一致,可以通過定義全局變量實(shí)現(xiàn)有多個返回值的C語言函數(shù),也可以考慮把要求返回的數(shù)個值定義成一個結(jié)構(gòu)體,然后同樣以傳遞結(jié)構(gòu)體指針方式把結(jié)構(gòu)體的指針傳遞給形參結(jié)構(gòu)體指針,那么函數(shù)中對形參結(jié)構(gòu)體的修改即是對實(shí)參結(jié)構(gòu)體的修改,函數(shù)被調(diào)用后獲取的實(shí)參結(jié)構(gòu)體成員即為函數(shù)的多個返回值,下面以實(shí)例演示該方法的應(yīng)用。

實(shí)例3:編寫一個用戶自定義函數(shù),允許用戶錄入學(xué)生的基本信息(包括學(xué)號、姓名、所屬班級、總評成績),并返回這些基本信息給主調(diào)函數(shù)。

方法:把學(xué)生基本信息定義成一個結(jié)構(gòu)體,在用戶自定義函數(shù)中傳遞該結(jié)構(gòu)體的指針,則自定義函數(shù)中對結(jié)構(gòu)體成員的錄入操作即是對實(shí)參結(jié)構(gòu)體成員的錄入操作,從而實(shí)現(xiàn)多個返回值。參考代碼如下:

#include "stdio.h"

#include "conio.h"

struct inf{/*定義學(xué)生結(jié)構(gòu)體,分別包含成員學(xué)號、姓名、班別、總評成績*/

char xh[12];

char name[20];

char class[15];

int chj;

};

main(void)

{

struct inf a1; /*定義學(xué)生結(jié)構(gòu)體類型變量*/

void xxxx(struct inf *ptr);

printf("請輸入學(xué)號,姓名,班別,總評成績,以空格隔開: ") ;

xxxx(a1);/*調(diào)用函數(shù),以學(xué)生結(jié)構(gòu)體類型變量地址作為實(shí)參*/

printf("學(xué)號:%s,姓名: %s,班別:%s,總評成績:%d",a1.xh, a1.name,a1.class,a1.chj);

getch();

}

void xxxx(struct inf *ptr)/*該函數(shù)實(shí)現(xiàn)對結(jié)構(gòu)體成員數(shù)據(jù)的錄入操作*/

{

char xh1[12],name1[20],class1[15];

int chj1;

scanf("%s%s%s%d",xh1,name1,class1,chj1);

strcpy(ptr-xh,xh1);

strcpy(ptr-name,name1);

strcpy(ptr-class,class1);

ptr-chj=chj1;

}

調(diào)試結(jié)果如下:

請輸入學(xué)號,姓名,班別,總評成績,以空格隔開:

200102LiLi200185

學(xué)號:200102,姓名: LiLi,班別:2001,總評成績:85

注意:當(dāng)函數(shù)要求返回的多個值是相互聯(lián)系的或者返回的多個值數(shù)據(jù)類型不一致時可以采用該方法。

總結(jié)

對于以上這三種方法,如果想要返回的數(shù)個值數(shù)據(jù)類型一致,可以考慮采用方法2;而對于不同數(shù)據(jù)類型的返回值,如果各個數(shù)值之間是相互聯(lián)系的,則方法3較為合適;方法1雖然在很多情況下都可以實(shí)現(xiàn)多個返回值的C語言函數(shù),但畢竟全局變量應(yīng)用過程中有很多危險(xiǎn),要慎重使用。

分享題目:c語言函數(shù)返回多個值 c語言中函數(shù)返回多個值
網(wǎng)頁URL:http://www.muchs.cn/article14/dohisge.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設(shè)、軟件開發(fā)做網(wǎng)站、靜態(tài)網(wǎng)站網(wǎng)站維護(hù)、網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)