當前位置:首頁 » 編程語言 » c語言如何返回多個值
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言如何返回多個值

發布時間: 2023-01-14 04:42:12

c語言中一個函數怎樣返回多個值

方法一:設置全局變數,這樣你在形參中改變全局變數,在實參中也會有效。所以你可以在形參中改變多個全局變數的值,那麼在實參中就相當於返回多個值。
方法二:如果你用數組名作為形參,那麼你改變數組內容,比如排序,或者進行加減運算,回到實參時依然是有效的。這樣也會返回一組值。
方法三:可以利用指針變數,這個原理和方法二是一樣的,因為數組名本身就是數組首元素的地址。就不多說了。
方法四:如果你學過C++,可以引用參數

⑵ c語言如何定義一個函數可以返回多個值回去給主函數呀。

函數的返回值頂多是一個數,通過函數直接返回的這個數只有在是指針時才能給出多個數據結果。

可以考慮以下幾個方法:

  1. 返回指針:

    int*display() {int *p;p=malloc(sizeof(int)*6); ... return p;} //用p[0]~p[5]計算各位

    void main() {int*p; p=display(); ... free(p);}

  2. 使用全局變數:將shiwa,wa,qiao,,shi,ge定義成全局變數,然後子程序和主程序直接用

  3. 使用函數參數:

    void display(int* shiwa,int* wa,int* qiao,int* ,int* shi,int ge)

    函數中用類似這樣的用法計算:(*ge)=Data%10;

    void main() {int shiwa,wa,qiao,,shi,ge; display(&shiwa,&wa,&qiao,&,&shi,&ge)}

  4. 用一個足夠長的數返回:

    long display() {long n;... n=shiwa; n*=10; n+=wa; n*=10; n+=qiao; n*=10; n+=; n*=10; n+=shi; n*=10; n+=ge; return n;}

    void main() {int wa; long n; n=display(); wa=n/10000; wa%=10;}

⑶ C語言返回多個值的方法

導語:編寫有多個返回值的函數是所有C語言教材里均沒有提到的知識點,但在實際教學與應用的過程中我們都有可能會遇到這樣的問題。以下是引導學生採用的三種不同方法編寫多個返回值的C語言函數,一起來學習下吧:

方法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個整數: ");

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))/*最大值與第一個元素進行交換*/

{

k=i;

*temp=*ptr;

*ptr=*(ptr+k);

*(ptr+k)=*temp ;

}

if(*(ptr+n-1)>*(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<6;i++)

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

max_min(A,6);

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

getch();

}

調試結果如下:

請輸入6個整形數,以空格隔開:

5 8 9 32 -6 4

max=32,min=-6

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

方法3:傳遞結構體指針

分析:結構體作為教學中的一個難點,教材對它介紹的內容並不多,應用的實例更是少之又少,所以學生對於結構體普遍掌握情況不理想。其實,編寫返回多個值的C語言函數,也可以考慮採用結構體的方式去實現。通過方法2,我們知道如果返回的數個數值的數據類型不一致,可以通過定義全局變數實現有多個返回值的C語言函數,也可以考慮把要求返回的數個值定義成一個結構體,然後同樣以傳遞結構體指針方式把結構體的指針傳遞給形參結構體指針,那麼函數中對形參結構體的修改即是對實參結構體的修改,函數被調用後獲取的實參結構體成員即為函數的多個返回值,下面以實例演示該方法的應用。

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

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

#include "stdio.h"

#include "conio.h"

struct inf{/*定義學生結構體,分別包含成員學號、姓名、班別、總評成績*/

char xh[12];

char name[20];

char class[15];

int chj;

};

main(void)

{

struct inf a1; /*定義學生結構體類型變數*/

void xxxx(struct inf *ptr);

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

xxxx(&a1);/*調用函數,以學生結構體類型變數地址作為實參*/

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

getch();

}

void xxxx(struct inf *ptr)/*該函數實現對結構體成員數據的錄入操作*/

{

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;

}

調試結果如下:

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

200102LiLi200185

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

注意:當函數要求返回的多個值是相互聯系的或者返回的多個值數據類型不一致時可以採用該方法。

總結

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


⑷ C語言中函數調用怎麼返回兩個值

在C語言中,函數只能返回一個值,要返回兩個值,可以改換思路,通過其它方式做到。
1 建立數組,返回指針。
在要返回的兩個值類型相同時,可以用創建數組的方式,將要返回的值存在數組中,並返回數組首地址,這樣就可以實現返回兩個值的效果。
需要注意的是,要返回數組首地址,那麼返回的值不可以是局部變數,有如下幾種是可以的:
a) 使用靜態局部變數存儲,並返回地址;
b) 使用全局變數存儲,返回地址;
c) 函數中動態分配內存,並返回申請到的地址,此種方法需要注意,在使用後需要釋放;
d) 在參數中傳入數組地址,並返回。即返回的實際上是主調函數中的變數地址。

2 建立結構體,返回結構體變數。
將需要返回的值,寫成結構體形式,並返回結構體變數,這樣可以實現一個返回值中含有多組數據。

3 當數據規模較小時,可以採用將小規模數據合並為大規模數據的方式,進行返回。
比如,需要返回兩個char型數據時,可以通過返回一個short數據,高地位分別存儲各自的值。

除以上方法外,還可以不使用返回值的方式,而是通過函數參數傳值,或者全局變數傳值等方式,將要返回的值回傳給主調函數。

⑸ C語言的子函數怎麼返回兩個值

函數是不能直接返回兩個值的,不過可以通過數組,列表,鏈表等方式,返回多個值。

例如 int a[] f(),這個shu函數返回值就是一個整型的數組,如果你要返回兩個值,可以定義數組長度為2,a[0]保存第一個值,a[1]保存第二個值。

int fun(int a, int b, int *c, int *d);

參數是a,b,返回值是c,d,c和d用指針傳進去。

c,d可以是其他參數類型,也可以是數據結構。

函數返回值可以用於返回error。

(5)c語言如何返回多個值擴展閱讀:

如果沒有返回值類型名為"void", 整數類型int 類型返回值為整數類型int,以此類推……

類型名有:void int long float int* long* float* ……

C++中函數的調用:函數必須聲明後才可以被調用。調用格式為:函數名(實參)

調用時函數名後的小括弧中的實參必須和聲明函數時的函數括弧中的形參個數相同。

有返回值的函數可以進行計算,也可以做為右值進行賦值。

⑹ C語言:一個函數只能返回一個值嗎 如果不是,怎樣返回多值

返回一個數組就可以了。如果想返回不同類型的值,先定義個結構體,把要返回的值存入結構體變數,再把這個結構體變數返回就行了。

⑺ C語言中一個函數怎樣返回多個值

在C語言中,一般情況下函數的返回值是通過函數中的return語句來實現的,每調用一次return語句只能從函數中返回一個值。但在實際很多應用中,我們需要從函數中返回多個值,那我們可以用什麼方法實現呢?此時我們可以用三種方法來實現。
方法一:設置全局變數
全局變數是在函數外部定義的全局變數,它不屬於任何一個函數,其作用域是從變數的定義處開始,到本程序文件的結尾。在此作用域內,全局變數可為各個函數所引用。當我們需要函數返回多個值時,除了函數體中的return語句返回其中一個之外,其它的返回值我們可以通過定義全局變數來處理。因為根據全局變數的特點,在被調用函數中改變了多個全局變數和值,相當於其主調函數全局變數的值也發生了變化,也就相當於返回了多個值。
例如:利用一個函數求出正方形的周長和面積。
#include
double l=0;//定義全局變數l為正方形周長
void f(double a)//定義求面積和周長的函數
{ double s; s=a*a;//求面積
l=6*a;//求周長,並賦給全局變數l
return s;//僅返回面積的值
}
void main()
{ double a,area;
printf(「請輸入邊長:");
scanf("%f",&a);
area=f(a);//面積的值通過調用f函數返回值
printf(「面積為:%5.2lf\n」,area);
printf(「周長為:%5.2lf\n」,l);//周長即為全局變數l在f函數中改變後的值
}

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

方法二:使用數組名或指針作為函數的形參
數組名或者指針實際為地址,而數組一般都包括多個元素,指針也可以指向一組數據的著地址,把數組名或者指針作為函數形參,實際上相當於主調函數的實參與形參共用地址,所以在函數中的數組元素發生改變即是實參也隨之改變。也相當於在調用函數時多個值返回給主調函數。

實例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))/*最大值與第一個元素進行交換*/
{
k=i;
*temp=*ptr;
*ptr=*(ptr+k);
*(ptr+k)=*temp ;
}
if(*(ptr+n-1)>*(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<6;i++)
scanf("%d",&A[i]);
max_min(A,6);
printf("max=%d, min=%d\n \n",A[0],A[5]);
getch();
}
調試結果如下:
請輸入6個整形數,以空格隔開:
5 8 9 32 -6 4
max=32,min=-6

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

方法三:使用結構體指針作為函數的形參

編寫返回多個值的C語言函數,可以考慮採用結構體的方式去實現。如果返回的數個數值的數據類型不一致,可以通過定義全局變數實現有多個返回值的C語言函數,也可以考慮把要求返回的數個值定義成一個結構體,然後同樣以傳遞結構體指針方式把結構體的指針傳遞給形參結構體指針,那麼函數中對形參結構體的修改即是對實參結構體的修改,函數被調用後獲取的實參結構體成員即為函數的多個返回值,下面以實例演示該方法的應用。
實例3:編寫一個用戶自定義函數,允許用戶錄入學生的基本信息(包括學號、姓名、所屬班級、總評成績),並返回這些基本信息給主調函數。
方法:把學生基本信息定義成一個結構體,在用戶自定義函數中傳遞該結構體的指針,則自定義函數中對結構體成員的錄入操作即是對實參結構體成員的錄入操作,從而實現多個返回值。參考代碼如下:
#include "stdio.h"
#include "conio.h"
struct inf{/*定義學生結構體,分別包含成員學號、姓名、班別、總評成績*/
char xh[12];
char name[20];
char class[15];
int chj;
};
main(void)
{
struct inf a1; /*定義學生結構體類型變數*/
void xxxx(struct inf *ptr);
printf("請輸入學號,姓名,班別,總評成績,以空格隔開:\n") ;
xxxx(&a1);/*調用函數,以學生結構體類型變數地址作為實參*/
printf("學號:%s,姓名: %s,班別:%s,總評成績:%d",a1.xh, a1.name,a1.class,a1.chj);
getch();
}
void xxxx(struct inf *ptr)/*該函數實現對結構體成員數據的錄入操作*/
{
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;
}
調試結果如下:
請輸入學號,姓名,班別,總評成績,以空格隔開:
200102LiLi200185
學號:200102,姓名: LiLi,班別:2001,總評成績:85
注意:當函數要求返回的多個值是相互聯系的或者返回的多個值數據類型不一致時可以採用該方法。

結束語

對於以上這三種方法,如果想要返回的數個值數據類型一致,可以考慮採用方法2;而對於不同數據類型的返回值,如果各個數值之間是相互聯系的,則方法3較為合適;方法1雖然在很多情況下都可以實現多個返回值的C語言函數,但畢竟全局變數應用過程中有很多危險,要慎重使用。
通過對以上幾種方法的分析講解,在教學過程中,學生再遇到這樣的問題時,就能根據返回值的情況選擇合適的途徑去實現多個返回值的C語言函數。另外,如果再遇到類似的無法用教材知識點去直接解決的問題時,他們基本都能舉一反三地嘗試採用間接方式去解決。

參考材料:http://blog.csdn.net/supreme42/article/details/7636475
http://wenku..com/link?url=

⑻ c語言函數如何返回多個值

c語言函數只能最多有一個返回值。我們以一個數據運算函數作為實例講解:

使用指針返回額外數據:定義指針參數,將結果通過指針返回。

如果有很多類型相同的數據,如何返回數組呢?c語言也只能藉助指針返回數組。

使用結構體返回:如果返回多個數據,並且各個數據類型都不相同。那麼只能通過結構體返回。

使用結構體指針返回:直接返回結構體,程序執行效率會受到影響。因為需要復制結構體數據,如果結構體數據比較大,復制操作會損耗程序性能。

通過使用結構體指針,我們也可以返回多個數據結果。

在c++中,除了使用指針,通常使用引用返回多個數據。與指針相比,使用引用時不用擔心函數調用者傳入不符合預期的指針。

⑼ c語言中調用函數如何返回多個值

主要可以通過指針或數組返回多個值,測試代碼如下,
//程序功能,通過結構體實現多個數據返回及通過多個變數指針實現
#include
<stdio.h>
#include
<stdlib.h>
#include
<string.h>
#define
PI
3.1415926
struct
test
{
int
x;
char
str[20];
};
//返回結構體,實現多個數據返回
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語言函數名義上函數返回值只能有一個變數或者無返回值,但返回的變數可以是指針或結構體等更復雜的數據,通過指針或結構體從而變相實現多參數返回。可以作為實參間接返回或直接作為返回值返回,但需注意不要返回臨時變數,如getTest()函數中不能定義struct
test
t變數直接返回。

⑽ c語言中調用函數如何返回多個值

建立數組,返回指針。

在要返回的兩個值類型相同時,可以用創建數組的方式,將要返回的值存在數組中,並返回數組首地址,這樣就可以實現返回兩個值的效果。需要注意的是,要返回數組首地址,那麼返回的值不可以是局部變數,有如下幾種是可以的:

a) 使用靜態局部變數存儲,並返回地址;

b) 使用全局變數存儲,返回地址;

c) 函數中動態分配內存,並返回申請到的地址,此種方法需要注意,在使用後需要釋放;

d) 在參數中傳入數組地址,並返回。即返回的實際上是主調函數中的變數地址。

(10)c語言如何返回多個值擴展閱讀

通常我們希望通過函數調用使主調函數能得到一個確定的值,這就是函數的返回值。函數的返回值是通過函數中的 return 語句獲得的。return 語句將被調函數中的一個確定的值帶回到主調函數中,供主調函數使用。

函數的返回值類型是在定義函數時指定的。return 語句中表達式的類型應與定義函數時指定的返回值類型一致。如果不一致,則以函數定義時的返回值類型為准,對 return 語句中表達式的類型自動進行轉換,然後再將它返回給主調函數使用。

在調用函數時,如果需要從被調函數返回一個值供主調函數使用,那麼返回值類型必須定義成非 void 型。此時被調函數中必須包含 return 語句,而且 return 後面必須要有返回值,否則就是語法錯誤。

如果函數有返回值,那麼 return 語句後面的括弧可以不要,比如「return(z);」等價於「return z;」。若不需要返回值則可以不要 return 語句。

需要強調的是,一個函數中可以有多個 return 語句,但並不是所有的 return 語句都起作用。執行到哪個 return 語句,就是哪個 return 語句起作用,該 return 語句後的其他語句就都不會執行了。