十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
在C語言中,函數(shù)只能返回一個(gè)值,要返回兩個(gè)值,可以改換思路,通過其它方式做到。

成都創(chuàng)新互聯(lián)公司2013年開創(chuàng)至今,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目做網(wǎng)站、成都做網(wǎng)站網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元新華做網(wǎng)站,已為上家服務(wù),為新華各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18980820575
1 建立數(shù)組,返回指針。
在要返回的兩個(gè)值類型相同時(shí),可以用創(chuàng)建數(shù)組的方式,將要返回的值存在數(shù)組中,并返回?cái)?shù)組首地址,這樣就可以實(shí)現(xiàn)返回兩個(gè)值的效果。
需要注意的是,要返回?cái)?shù)組首地址,那么返回的值不可以是局部變量,有如下幾種是可以的:
a) 使用靜態(tài)局部變量存儲(chǔ),并返回地址;
b) 使用全局變量存儲(chǔ),返回地址;
c) 函數(shù)中動(dòng)態(tài)分配內(nèi)存,并返回申請(qǐng)到的地址,此種方法需要注意,在使用后需要釋放;
d) 在參數(shù)中傳入數(shù)組地址,并返回。即返回的實(shí)際上是主調(diào)函數(shù)中的變量地址。
2 建立結(jié)構(gòu)體,返回結(jié)構(gòu)體變量。
將需要返回的值,寫成結(jié)構(gòu)體形式,并返回結(jié)構(gòu)體變量,這樣可以實(shí)現(xiàn)一個(gè)返回值中含有多組數(shù)據(jù)。
3 當(dāng)數(shù)據(jù)規(guī)模較小時(shí),可以采用將小規(guī)模數(shù)據(jù)合并為大規(guī)模數(shù)據(jù)的方式,進(jìn)行返回。
比如,需要返回兩個(gè)char型數(shù)據(jù)時(shí),可以通過返回一個(gè)short數(shù)據(jù),高地位分別存儲(chǔ)各自的值。
除以上方法外,還可以不使用返回值的方式,而是通過函數(shù)參數(shù)傳值,或者全局變量傳值等方式,將要返回的值回傳給主調(diào)函數(shù)。
void?another(int?*?var)
{
int?x?=?5;
*var?=?x;
}
void?myfun()
{
int?i;
another(i);?//?此處的?i?得到另一個(gè)函數(shù)中變量?x?的值。
}
在另一個(gè)函數(shù)內(nèi)調(diào)用該函數(shù)。從而得到該函數(shù)的返回值,實(shí)現(xiàn)傳遞。
例:
int
sum(int
m,int
n)
{
return
m+n;
}
void
main()
{
printf("%d",sum(3,6));
}
此例中,main函數(shù)在輸出語句中調(diào)用sum函數(shù)從而得到sum函數(shù)的返回值并輸出
a為main函數(shù)中的局部變量,在函數(shù)zjsx中是不可見的,應(yīng)該以入?yún)⒌男问桨補(bǔ)傳入zjsx中。
void zjsx(int a);
int main()
{
int a=0;
zjsx(a);
return 0;
}
void zjsx(int a)
{
printf("a的值為%d\n",a);
}
方法1.做成全局量
方法2.使用傳址的方式,將c作為參數(shù)傳遞給函數(shù)a
不過第2種方法需要注意一下c的生命期,不要在函數(shù)中的c已經(jīng)釋放了,
在a中還使用,這樣會(huì)造成異常
在C語言中,一般情況下函數(shù)的返回值是通過函數(shù)中的return語句來實(shí)現(xiàn)的,每調(diào)用一次return語句只能從函數(shù)中返回一個(gè)值。但在實(shí)際很多應(yīng)用中,我們需要從函數(shù)中返回多個(gè)值,那我們可以用什么方法實(shí)現(xiàn)呢?此時(shí)我們可以用三種方法來實(shí)現(xiàn)。
方法一:設(shè)置全局變量
全局變量是在函數(shù)外部定義的全局變量,它不屬于任何一個(gè)函數(shù),其作用域是從變量的定義處開始,到本程序文件的結(jié)尾。在此作用域內(nèi),全局變量可為各個(gè)函數(shù)所引用。當(dāng)我們需要函數(shù)返回多個(gè)值時(shí),除了函數(shù)體中的return語句返回其中一個(gè)之外,其它的返回值我們可以通過定義全局變量來處理。因?yàn)楦鶕?jù)全局變量的特點(diǎn),在被調(diào)用函數(shù)中改變了多個(gè)全局變量和值,相當(dāng)于其主調(diào)函數(shù)全局變量的值也發(fā)生了變化,也就相當(dāng)于返回了多個(gè)值。
例如:利用一個(gè)函數(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(“請(qǐng)輸入邊長:");
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ù)中返回多值的情況,這種方式易懂。但是全局變量用多了會(huì)破壞代碼的安全性,結(jié)構(gòu)性,這主要是全局變量在所有函數(shù)中都可以使用,從而其值的變化不確定,所以我們要慎用。
方法二:使用數(shù)組名或指針作為函數(shù)的形參
數(shù)組名或者指針實(shí)際為地址,而數(shù)組一般都包括多個(gè)元素,指針也可以指向一組數(shù)據(jù)的著地址,把數(shù)組名或者指針作為函數(shù)形參,實(shí)際上相當(dāng)于主調(diào)函數(shù)的實(shí)參與形參共用地址,所以在函數(shù)中的數(shù)組元素發(fā)生改變即是實(shí)參也隨之改變。也相當(dāng)于在調(diào)用函數(shù)時(shí)多個(gè)值返回給主調(diào)函數(shù)。
實(shí)例2:編寫函數(shù)求一維整形數(shù)組的最大值與最小值,并把最大值與最小值返回給主調(diào)函數(shù)。
方法:以指針方式傳遞該一維數(shù)組的地址,然后把數(shù)組的最大值與數(shù)組的第一個(gè)元素交換,把數(shù)組的最小值與最后一個(gè)元素交換。函數(shù)被調(diào)用完畢后,實(shí)參數(shù)組中的第一元素為數(shù)組的最大值,實(shí)參數(shù)組中最后一個(gè)元素為數(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))/*最大值與第一個(gè)元素進(jìn)行交換*/
{
k=i;
*temp=*ptr;
*ptr=*(ptr+k);
*(ptr+k)=*temp ;
}
if(*(ptr+n-1)*(ptr+i))/*最小值與最后一個(gè)元素進(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é)果如下:
請(qǐng)輸入6個(gè)整形數(shù),以空格隔開:
5 8 9 32 -6 4
max=32,min=-6
注意:該方法適用于多個(gè)返回值的數(shù)據(jù)類型一致的情況。當(dāng)返回值數(shù)據(jù)類型不一致時(shí),不適用該方法。
方法三:使用結(jié)構(gòu)體指針作為函數(shù)的形參
編寫返回多個(gè)值的C語言函數(shù),可以考慮采用結(jié)構(gòu)體的方式去實(shí)現(xiàn)。如果返回的數(shù)個(gè)數(shù)值的數(shù)據(jù)類型不一致,可以通過定義全局變量實(shí)現(xiàn)有多個(gè)返回值的C語言函數(shù),也可以考慮把要求返回的數(shù)個(gè)值定義成一個(gè)結(jié)構(gòu)體,然后同樣以傳遞結(jié)構(gòu)體指針方式把結(jié)構(gòu)體的指針傳遞給形參結(jié)構(gòu)體指針,那么函數(shù)中對(duì)形參結(jié)構(gòu)體的修改即是對(duì)實(shí)參結(jié)構(gòu)體的修改,函數(shù)被調(diào)用后獲取的實(shí)參結(jié)構(gòu)體成員即為函數(shù)的多個(gè)返回值,下面以實(shí)例演示該方法的應(yīng)用。
實(shí)例3:編寫一個(gè)用戶自定義函數(shù),允許用戶錄入學(xué)生的基本信息(包括學(xué)號(hào)、姓名、所屬班級(jí)、總評(píng)成績),并返回這些基本信息給主調(diào)函數(shù)。
方法:把學(xué)生基本信息定義成一個(gè)結(jié)構(gòu)體,在用戶自定義函數(shù)中傳遞該結(jié)構(gòu)體的指針,則自定義函數(shù)中對(duì)結(jié)構(gòu)體成員的錄入操作即是對(duì)實(shí)參結(jié)構(gòu)體成員的錄入操作,從而實(shí)現(xiàn)多個(gè)返回值。參考代碼如下:
#include "stdio.h"
#include "conio.h"
struct inf{/*定義學(xué)生結(jié)構(gòu)體,分別包含成員學(xué)號(hào)、姓名、班別、總評(píng)成績*/
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("請(qǐng)輸入學(xué)號(hào),姓名,班別,總評(píng)成績,以空格隔開:\n") ;
xxxx(a1);/*調(diào)用函數(shù),以學(xué)生結(jié)構(gòu)體類型變量地址作為實(shí)參*/
printf("學(xué)號(hào):%s,姓名: %s,班別:%s,總評(píng)成績:%d",a1.xh, a1.name,a1.class,a1.chj);
getch();
}
void xxxx(struct inf *ptr)/*該函數(shù)實(shí)現(xiàn)對(duì)結(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é)果如下:
請(qǐng)輸入學(xué)號(hào),姓名,班別,總評(píng)成績,以空格隔開:
200102LiLi200185
學(xué)號(hào):200102,姓名: LiLi,班別:2001,總評(píng)成績:85
注意:當(dāng)函數(shù)要求返回的多個(gè)值是相互聯(lián)系的或者返回的多個(gè)值數(shù)據(jù)類型不一致時(shí)可以采用該方法。
結(jié)束語
對(duì)于以上這三種方法,如果想要返回的數(shù)個(gè)值數(shù)據(jù)類型一致,可以考慮采用方法2;而對(duì)于不同數(shù)據(jù)類型的返回值,如果各個(gè)數(shù)值之間是相互聯(lián)系的,則方法3較為合適;方法1雖然在很多情況下都可以實(shí)現(xiàn)多個(gè)返回值的C語言函數(shù),但畢竟全局變量應(yīng)用過程中有很多危險(xiǎn),要慎重使用。
通過對(duì)以上幾種方法的分析講解,在教學(xué)過程中,學(xué)生再遇到這樣的問題時(shí),就能根據(jù)返回值的情況選擇合適的途徑去實(shí)現(xiàn)多個(gè)返回值的C語言函數(shù)。另外,如果再遇到類似的無法用教材知識(shí)點(diǎn)去直接解決的問題時(shí),他們基本都能舉一反三地嘗試采用間接方式去解決。
參考材料: