有一天,我正愉悦地写着函数,突然,我想让这个函数返回多个值,
一下子懵逼了呀
无奈之下,只好翻阅资料,整理了这篇文章
1.全局变量法(慎用)
2.数组指针法
3.结构体指针
1.全局变量法:
分析:全局变量作为C语言的一个知识点,虽然我们都了解它的特点,但在实际教学过程中应用得并不是很多。由于全局变量的作用域是从定义变量开始直到程序结束,而对于编写有多个返回值的C语言函数,我们可以考虑把要返回的多个值定义成全局变量。当函数被调用时,全局变量被更改,我们再把更改后的全局变量值应用于主调函数中。函数被调用后被更改后的全局变量值即为函数的数个返回值。下面以一个实例演示该方法的应用。
实例1:编写函数求2个数中的最大值与最小值。
方法:把最大值、最小值分别定义成2个全局变量max、min,在用户自定义函数中把求出来的最大值与最小值分别赋给全局变量max、min。函数调用完毕后全局变量的max、min值即保存了函数要求返回的值。程序参考代码如下:
#include
#include //make by 以太 int max,min;//定义两个全局变量用于保存函数的返回值 void max_min(int a,int b) /*定义求最大最小值的函数*/ { max=min=a; /*初始化最大最小值*/ max=(a>b)?a:b; min=(a<b)?a:b;//make by 以太 } main() { int x,y; printf("请输入2个整数:\n"); scanf("%d,%d",&x,&y); max_min(x,y) ;/*调用求最大值与最小值的函数*/ printf("l两个数中的最大值为:%d;最小值为:%d",max,min);/*输出最大值与最小值*/ }
运行结果:
2.数组指针法:(考考自己,数组指针和指针数组能分清吗?)
分析:在教学过程中,我们知道C语言函数参数的传递方式有值传递与地址传递。==当进行值传递时,主调函数把实参的值复制给形参,形参获得从主调函数传递过来的值运行函数。在值传递过程中被调函数参数值的更改不能导致实参值的更改。而如果是地址传递,由于传递过程中从实参传递过来的是地址,所以被调函数中形参值的更改会直接导致实参值的更改。==因此,我们可以考虑把多个返回值作为数组元素定义成一个数组的形式,并使该数组的地址作为函数的形式参数,以传址方式传递数组参数。函数被调用后,形参数组元素改变导致实参改变,我们再从改变后的实参数组元素中获得函数的多个返回值。
实例2:编写函数求一维整形数组的最大值与最小值,并把最大值与最小值返回给主调函数。
方法:以指针方式传递该一维数组的地址,然后把数组的最大值与数组的第一个元素交换,把数组的最小值与最后一个元素交换。函数被调用完毕后,实参数组中的第一元素为数组的最大值,实参数组中最后一个元素为数组的最小值,从而实现返回数组的最大值与最小值的功能。
#include
//make by 以太
void max_min(int *ptr,int n) /*定义求数组最大值最小值的函数,传递数组指针*/
{
int i,j,k;/*j保存最大值所在位置,k保存最小值所在位置*/
int *temp;/*用于交换位置*/
*temp=*ptr;
for(i=0;i<n;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;} //make by 以太
}
}
/*调用最大最小值函数*/
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]);
}
3.传递结构体指针法:
分析:结构体作为教学中的一个难点,教材对它介绍的内容并不多,应用的实例更是少之又少,所以学生对于结构体普遍掌握情况不理想。其实,编写返回多个值的C语言函数,也可以考虑采用结构体的方式去实现。通过方法2,我们知道如果返回的数个数值的数据类型不一致,可以通过定义全局变量实现有多个返回值的C语言函数,也可以考虑把要求返回的数个值定义成一个结构体,然后同样以传递结构体指针方式把结构体的指针传递给形参结构体指针,那么函数中对形参结构体的修改即是对实参结构体的修改,函数被调用后获取的实参结构体成员即为函数的多个返回值,下面以实例演示该方法的应用。
实例3:编写一个用户自定义函数,允许用户录入学生的基本信息(包括学号、姓名、所属班级、总评成绩),并返回这些基本信息给主调函数。
方法:把学生基本信息定义成一个结构体,在用户自定义函数中传递该结构体的指针,则自定义函数中对结构体成员的录入操作即是对实参结构体成员的录入操作,从而实现多个返回值。
#include
//make by 以太
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);
}
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); //make by 以太
strcpy(ptr->name,name1);
strcpy(ptr->class,class1);
ptr->chj=chj1;
}
第一次尝试写这么多的博客,有点紧张。写的也不大好,希望能帮助到有问题的小伙伴们
第一种方法谨慎使用,学过c的小伙伴应该都知道”模块化“,不知道的话,得去百度百度,顺便补补基础知识了。如果用全局变量的话就仿佛意味着一个函数不是一个函数,与其他函数有了关系,不利于模块化,有可能会导致大漏洞的,造成各种出错,可以想象一下,如果是多人合作编写的话,你这么写的话,会不会也会给别人造成麻烦呢?
举一个出错的实例康康吧:我在这边定义了一个全局变量,然后不小心在程序范围里修改了它的值,那么最后输出的是什么?
第二种方法的运用场景就是,适用于多个返回值的数据类型一致的情况。
第三种方法的运用场景是:当函数要求返回的多个值是相互联系的或者返回的多个值数据类型不一致时可以采用该方法。