C语⾔中如何从⼀个函数获取两个及两个以上的返回值
C语⾔中如何从⼀个函数获取两个及两个以上的返回值
⽅法⼀:设置全局变量,这样你在形参中改变全局变量,在实参中也会有效。所以你可以在形参中改变多个全局变量的值,那么在实参中就相当于返回多个值。
⽅法⼆:如果你⽤数组名作为形参,那么你改变数组内容,⽐如排序,或者进⾏加减运算,回到实参时依然是有效的。这样也会返回⼀组值。
⽅法三:可以利⽤指针变量,这个原理和⽅法⼆是⼀样的,因为数组名本⾝就是数组⾸元素的地址。就不多说了。
⽅法四:如果你学过C++,可以引⽤参数
如何编写有多个返回值的C语⾔函数
⽅法1:利⽤全局变量
分析:全局变量作为C语⾔的⼀个知识点,虽然我们都了解它的特点,但在实际教学过程中应⽤得并不
是很多。由于全局变量的作⽤域是从定义变量开始直到程序结束,⽽对于编写有多个返回值的C语⾔函数,我们可以考虑把要返回的多个值定义成全局变量。当函数被调⽤时,全局变量被更改,我们再把更改后的全局变量值应⽤于主调函数中。函数被调⽤后被更改后的全局变量值即为函数的数个返回值。下⾯以⼀个实例演⽰该⽅法的应⽤。
实例1:编写函数求3个数中的最⼤值与最⼩值。
⽅法:把最⼤值、最⼩值分别定义成2个全局变量max、min,在⽤户⾃定义函数中把求出来的最⼤值与最⼩值分别赋给全局变量max、min。函数调⽤完毕后全局变量的max、min值即保存了函数要求返回的值。程序参考代码如下:
调试结果如下:
请输⼊3个整数:
5,-6,2
三个数中的最⼤值为:5;最⼩值为:-6
注意:该⽅法虽然可以实现有多个返回值的函数,但由于全局变量不能保证值的正确性(因为其作⽤
域是全局,所以程序范围内都可以修改它的值,如果出现错误将⾮常难以发现),并且全局变量增加了程序间模块的耦合,所以该⽅法要慎⽤。
3⽅法2:传递数组指针
1#include "stdio.h"
2 #include "conio.h"
3 int max,min;
4 void max_min(int a,int b,int c)
5 {max=min=a;
自定义函数怎么用c语言6 if(max if(max if(min>b)min=b;
7 if(min>c)min=c;
8 }
9 main()
10 {int x,y,z;
11 printf(" 请输⼊3个整数:\n");
12 scanf("%d,%d,%d",&x,&y,&z);
13 max_min(x,y,z) ;
14 printf("三个数中的最⼤值为:%d;最⼩值为:%d",max,min);
15 getch();
16 }
分析:在教学过程中,我们知道C语⾔函数参数的传递⽅式有值传递与地址传递。当进⾏值传递时,主调函数把实参的值复制给形参,形参获得从主调函数传递过来的值运⾏函数。在值传递过程中被调函数参数值的更改不能导致实参值的更改。⽽如果是地址传递,由于传递过程中从实参传递过来的是地址,所以被调函数中形参值的更改会直接导致实参值的更改。因此,我们可以考虑把多个返回值作为数组元素定义成⼀个数组的形式,并使该数组的地址作为函数的形式参数,以传址⽅式传递数组参数。函数被调⽤后,形参数组元素改变导致实参改变,我们再从改变后的实参数组元素中获得函数的多个返回值。以下实例演⽰该⽅法的应⽤。
实例2:编写函数求⼀维整形数组的最⼤值与最⼩值,并把最⼤值与最⼩值返回给主调函数。
⽅法:以指针⽅式传递该⼀维数组的地址,然后把数组的最⼤值与数组的第⼀个元素交换,把数组的最⼩值与最后⼀个元素交换。函数被调⽤完毕后,实参数组中的第⼀元素为数组的最⼤值,实参数组中最后⼀个元素为数组的最⼩值,从⽽实现返回数组的最⼤值与最⼩值的功能。程序参考代码如下:
1#include "stdio.h"
2 #include "conio.h"
3 void max_min(int *ptr,int n)
4 {int i,j,k;
5 int *temp;
6 *temp=*ptr;
7 for(i=0;i {
8 if(*ptr<*(ptr+i))
9 {
10 k=i;
11 *temp=*ptr;
12 *ptr=*(ptr+k);
13 *(ptr+k)=*temp ;
14 }
15 if(*(ptr+n-1)>*(ptr+i))
16 {
17 j=i;
18 *temp =*(ptr+n-1);
19 *(ptr+n-1)=*(ptr+j);
20 *(ptr+j)= *temp ;}
21 }
22 }
23
24 main()
25 {
26 int A[6],i;
27 for(i=0;i<6;i++)
28 scanf("%d",&A[i]);
29 max_min(A,6);
30 printf("max=%d, min=%d\n \n",A[0],A[5]);
31 getch();
32 }
调试结果如下:
请输⼊6个整形数,以空格隔开:
5 8 9 32 -
6 4
max=32,min=-6
注意:该⽅法适⽤于多个返回值的数据类型⼀致的情况。当返回值数据类型不⼀致时,不适⽤该⽅法。
4⽅法3:传递结构体指针
分析:结构体作为教学中的⼀个难点,教材对它介绍的内容并不多,应⽤的实例更是少之⼜少,所以学⽣对于结构体普遍掌握情况不理想。其实,编写返回多个值的C语⾔函数,也可以考虑采⽤结构体
的⽅式去实现。通过⽅法2,我们知道如果返回的数个数值的数据类型不⼀致,可以通过定义全局变量实现有多个返回值的C语⾔函数,也可以考虑把要求返回的数个值定义成⼀个结构体,然后同样以传递结构体指针⽅式把结构体的指针传递给形参结构体指针,那么函数中对形参结构体的修改即是对实参结构体的修改,函数被调⽤后获取的实参结构体成员即为函数的多个返回值,下⾯以实例演⽰该⽅法的应⽤。
实例3:编写⼀个⽤户⾃定义函数,允许⽤户录⼊学⽣的基本信息(包括学号、姓名、所属班级、总评成绩),并返回这些基本信息给主调函数。
⽅法:把学⽣基本信息定义成⼀个结构体,在⽤户⾃定义函数中传递该结构体的指针,则⾃定义函数中对结构体成员的录⼊操作即是对实参结构体成员的录⼊操作,从⽽实现多个返回值。参考代码如下:
1 #include "stdio.h"
2 #include "conio.h"
3 struct inf{
4 char xh[12];
5 char name[20];
6 char class[15];
7 int chj;
8 };
9 main(void)
10 {
11 struct inf a1;
12 void xxxx(struct inf *ptr);
13 printf("请输⼊学号,姓名,班别,总评成绩,以空格隔开:\n") ;
14 xxxx(&a1);
15 printf("学号:%s,姓名: %s,班别:%s,总评成绩:%d",a1.xh, a1.name,a1.class,a1.chj);
16 getch();
17 }
18 void xxxx(struct inf *ptr)
19 {
20 char xh1[12],name1[20],class1[15];
21 int chj1;
22 scanf("%s%s%s%d",xh1,name1,class1,&chj1);
23 strcpy(ptr->xh,xh1);
24 strcpy(ptr->name,name1);
25 strcpy(ptr->class,class1);
26 ptr->chj=chj1;
27 }
调试结果如下:
请输⼊学号,姓名,班别,总评成绩,以空格隔开:
200102LiLi200185
学号:200102,姓名: LiLi,班别:2001,总评成绩:85
注意:当函数要求返回的多个值是相互联系的或者返回的多个值数据类型不⼀致时可以采⽤该⽅法。
5结束语
对于以上这三种⽅法,如果想要返回的数个值数据类型⼀致,可以考虑采⽤⽅法2;⽽对于不同数据类型的返回值,如果各个数值之间是相互联系的,则⽅法3较为合适;⽅法1虽然在很多情况下都可以实现多个返回值的C语⾔函数,但毕竟全局变量应⽤过程中有很多危险,要慎重使⽤。
通过对以上⼏种⽅法的分析讲解,在教学过程中,学⽣再遇到这样的问题时,就能根据返回值的情况选择合适的途径去实现多个返回值的C语⾔函数。另外,如果再遇到类似的⽆法⽤教材知识点去直接解决的问题时,他们基本都能举⼀反三地尝试采⽤间接⽅式去解决。
参考⽂献
[1] 谭浩强. C程序设计(第五版)[M]. 北京:清华⼤学出版社
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论