如何實現C語言多個函數值的返回
- C語言
- 關注:1.44W次
導語:C語言中一般情況下函數值的返回都是通過return語句來實現的,但是return語句每次調用只能返回一個函數值,當要返回多個函數值時就必須用其它途徑來間接的進行處理。 下面就由小編為大家介紹一下如何實現C語言多個函數值的返回,歡迎大家閲讀!
方法一:設置全局變量
全局變量是在函數外部定義的全局變量,它不屬於任何一個函數,其作用域是從變量的定義處開始,到本程序文件的結尾。在此作用域內,全局變量可為各個函數所引用。當我們需要函數返回多個值時,除了函數體中的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”,area);
printf(“周長為:%5.2lf”,l);//周長即為全局變量l在f函數中改變後的值
}
上面的例子即用全局變量實現了函數中返回多值的情況,這種方式易懂。但是全局變量用多了會破壞代碼的安全性,結構性,這主要是全局變量在所有函數中都可以使用,從而其值的變化不確定,所以我們要慎用。
方法二:使用數組名或指針作為函數的形參
數組名或者指針實際為地址,而數組一般都包括多個元素,指針也可以指向一組數據的着地址,把數組名或者指針作為函數形參,實際上相當於主調函數的實參與形參共用地址,所以在函數中的數組元素髮生改變即是實參也隨之改變。也相當於在調用函數時多個值返回給主調函數。
例如:
#include
void a(int array[]);
int main()
{
int array[5]={1,2,3,4,5},i;
a(array);
for(i=0;i<5;i++)
printf(“%d”,array[i]);
}
void a(int array1[])
{
int i;
for(i=0;i<5;i++)
array1[i]++;
}
在此程序中,當在主函數中調用a函數時,函數a中的形參數組array1與主函數中的實參數組array實際上共用地址,當函數a中的形參數組array1中的元素改變時,也就是實參數組array中的元素也發生了改變,從效果上看相當於形參把改變後的值傳遞給實參,而且是改變了多個值。但是這種數組名作為參數時,要求數組元素的類型相同,也就是説用這種方法返回多個值時,要求這多個值的類型必須一樣,所以此方法僅適用於返回相同類型的多個值。
方法三:用結構體作為函數的形參
在上述方法二中用數組返回函數多個值的`情況,根據數組的特點要求返回的多個值必須是類型相同的數據,但是在實際應用過程中,有時返回值的類型不一定相同,那麼我們有不有新的方法來處理這種情況?實際上在C語言中包含多個元素的構造類型除了數組之外,還有結構體和共用體。其中數組的元素類型必須相同,但是結構體和共用體的元素類型可以不相同。而結構體和共用體又有區別,在任何同一時刻,共用體只存放了一個被選中的成員,而結構體的所有成員都存在。因此,當函數需要返回多個不同類型的值時,用結構體來實現是比較函數的多值返回比較合理。例如:
#include
#include
#include
typedef struct student
{
char name[10];
int age;
}Student;
Student*fun1()
{
Student*ps=new Student;
strcpy(ps->name,"zhong");
ps->age=0x100;
return ps;
}
void main()
{
*ps=fun1();
printf(“name:%s age:%d”,ps->name,ps->age);
}
上例中fun1函數返回了name和age兩個不同類型的值,分別是字符數組和整型,這兩個不同的值是被封裝在結構體Student中,這樣就通過結構體的方式同時返回多個函數值。
以上三種方法都可以解決C語言中返回函數多個值的問題,但是這三種方法的側重點是有區別的,所以在選擇多值返回的方法時要根據實際問題進行合理的分析和選擇。
- 文章版權屬於文章作者所有,轉載請註明 https://xuezhezhai.com/zh-mo/jsj/cyuyan/mw9j4g.html