如何实现C语言多个函数值的返回
如何实现C语言多个函数值的返回
导语: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");
printf函数是如何实现的ps->age=0x100;
return ps;
}
void main()
{
*ps=fun1();
printf(“name:%s age:%d”,ps->name,ps->age);
}
上例中fun1函数返回了name和age两个不同类型的值,分别是字符数组和整型,这两个不同的值是被封装在结构体Student中,这样就通过结构体的方式同时返回多个函数值。
以上三种方法都可以解决C语言中返回函数多个值的问题,但是这三种方法的侧重点是有区别的,所以在选择多值返回的方法时要根据实际问题进行合理的分析和选择。
【如何实现C语言多个函数值的返回】
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论