C语言中,一个子函数返回多个变量应该怎么写
函数的返回值顶多是一个数,通过函数直接返回的这个数只有在是指针时才能给出多个数据结果。
可以考虑以下几个方法:
返回指针:
int* display() { int *p; p=malloc(sizeof(int)*6); ... return p; } //用p[0]~p[5]计算各位
void main() { int *p; p=display(); ... free(p); }
使用全局变量:将shiwa,wa,qiao,bai,shi,ge定义成全局变量,然后子程序和主程序直接用
使用函数参数:
void display(int* shiwa,int* wa,int* qiao,int* bai,int* shi,int ge)
函数中用类似这样的用法计算:(*ge)=Data%10;
void main() { int shiwa,wa,qiao,bai,shi,ge; display(&shiwa,&wa,&qiao,&bai,&shi,&ge) }
用一个足够长的数返回:
long display() { long n; ... n=shiwa; n*=10; n+=wa; n*=10; n+=qiao; n*=10; n+=bai; n*=10; n+=shi; n*=10; n+=ge; return n; }
void main() { int wa; long n; n=display(); wa=n/10000; wa%=10; }
在C语言中,一般情况下函数的返回值是通过函数中的return语句来实现的,每调用一次return语句只能从函数中返回一个值。但在实际很多应用中,我们需要从函数中返回多个值,那我们可以用什么方法实现呢?此时我们可以用三种方法来实现。
方法一:设置全局变量
全局变量是在函数外部定义的全局变量,它不属于任何一个函数,其作用域是从变量的定义处开始,到本程序文件的结尾。在此作用域内,全局变量可为各个函数所引用。当我们需要函数返回多个值时,除了函数体中的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\n”,area);
printf(“周长为:%5.2lf\n”,l);//周长即为全局变量l在f函数中改变后的值
}
上面的例子即用全局变量实现了函数中返回多值的情况,这种方式易懂。但是全局变量用多了会破坏代码的安全性,结构性,这主要是全局变量在所有函数中都可以使用,从而其值的变化不确定,所以我们要慎用。
方法二:使用数组名或指针作为函数的形参
数组名或者指针实际为地址,而数组一般都包括多个元素,指针也可以指向一组数据的着地址,把数组名或者指针作为函数形参,实际上相当于主调函数的实参与形参共用地址,所以在函数中的数组元素发生改变即是实参也随之改变。也相当于在调用函数时多个值返回给主调函数。
实例2:编写函数求一维整形数组的最大值与最小值,并把最大值与最小值返回给主调函数。
方法:以指针方式传递该一维数组的地址,然后把数组的最大值与数组的第一个元素交换,把数组的最小值与最后一个元素交换。函数被调用完毕后,实参数组中的第一元素为数组的最大值,实参数组中最后一个元素为数组的最小值,从而实现返回数组的最大值与最小值的功能。程序参考代码如下:
#include "stdio.h"
#include "conio.h"
void max_min(int *ptr,int n) /*定义求数组最大值最小值的函数,传递数组指针*/
{int i,j,k;/*j保存最大值所在位置,k保存最小值所在位置*/
int *temp;/*用于交换位置*/
*temp=*ptr;
for(i=0;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 ;}
}
}
/*调用最大最小值函数*/
main()
{
int A[6],i;
for(i=0;i<6;i++)
scanf("%d",&A[i]);
max_min(A,6);
printf("max=%d, min=%d
",A[0],A[5]);
getch();
}
调试结果如下:
请输入6个整形数,以空格隔开:
5 8 9 32 -6 4
max=32,min=-6
注意:该方法适用于多个返回值的数据类型一致的情况。当返回值数据类型不一致时,不适用该方法。
方法三:使用结构体指针作为函数的形参
编写返回多个值的C语言函数,可以考虑采用结构体的方式去实现。如果返回的数个数值的数据类型不一致,可以通过定义全局变量实现有多个返回值的C语言函数,也可以考虑把要求返回的数个值定义成一个结构体,然后同样以传递结构体指针方式把结构体的指针传递给形参结构体指针,那么函数中对形参结构体的修改即是对实参结构体的修改,函数被调用后获取的实参结构体成员即为函数的多个返回值,下面以实例演示该方法的应用。
实例3:编写一个用户自定义函数,允许用户录入学生的基本信息(包括学号、姓名、所属班级、总评成绩),并返回这些基本信息给主调函数。
方法:把学生基本信息定义成一个结构体,在用户自定义函数中传递该结构体的指针,则自定义函数中对结构体成员的录入操作即是对实参结构体成员的录入操作,从而实现多个返回值。参考代码如下:
#include "stdio.h"
#include "conio.h"
struct inf{/*定义学生结构体,分别包含成员学号、姓名、班别、总评成绩*/
char xh[12];
char name[20];
char class[15];
int chj;
};
main(void)
{
struct inf a1; /*定义学生结构体类型变量*/
void xxxx(struct inf *ptr);
printf("请输入学号,姓名,班别,总评成绩,以空格隔开:
") ;
xxxx(&a1);/*调用函数,以学生结构体类型变量地址作为实参*/
printf("学号:%s,姓名: %s,班别:%s,总评成绩:%d",a1.xh, a1.name,a1.class,a1.chj);
getch();
}
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);
strcpy(ptr->name,name1);
strcpy(ptr->class,class1);
ptr->chj=chj1;
}
调试结果如下:
请输入学号,姓名,班别,总评成绩,以空格隔开:
200102LiLi200185
学号:200102,姓名: LiLi,班别:2001,总评成绩:85
注意:当函数要求返回的多个值是相互联系的或者返回的多个值数据类型不一致时可以采用该方法。
结束语
对于以上这三种方法,如果想要返回的数个值数据类型一致,可以考虑采用方法2;而对于不同数据类型的返回值,如果各个数值之间是相互联系的,则方法3较为合适;方法1虽然在很多情况下都可以实现多个返回值的C语言函数,但毕竟全局变量应用过程中有很多危险,要慎重使用。
通过对以上几种方法的分析讲解,在教学过程中,学生再遇到这样的问题时,就能根据返回值的情况选择合适的途径去实现多个返回值的C语言函数。另外,如果再遇到类似的无法用教材知识点去直接解决的问题时,他们基本都能举一反三地尝试采用间接方式去解决。
参考材料:http://blog.csdn.net/supreme42/article/details/7636475
http://wenku.baidu.com/link?url=tJOYOInBS22mj0uJcYDEs0qZHFuCqiuhkKrrJNtoAYkffDnVIt6kiKusF491G2MVbDVzQGQgyAQ9moF3Og9v8Tt0Ny5jG05GgDmlwrhRs8K
要返回多个, 最常用的方法是通过参数返回。 即参数用指针方式带回
也可以把多个变量写成结构体,然后返回结构体变量
推荐用参数带回的方式。 效率更高。
c语言中,定义一个全局变量,在一个子函数中改变了值,怎么在下一个函数...
你都说是全局变量了,在任何地方都可以访问它,只是要注意在多线程下取它值的时候它是否已经改变了值,改变的时候可以设一个标志变量。
你们能不能给我通俗地解释一下在C语言中函数中是怎样调用函数的,函数调 ...
1.就是有一个主函数和一个子函数 所谓的调用就是把命名好的子函数放在主函数中使用拉 2.返回值就是用return把子函数中的结果调回主函数中再次进行运算...3.你那个是子函数啊 主函数还没写出来哪 用不了 大概就是这样把 我这部分的内容也是刚学 呵呵 ...
在C语言中怎么将子函数中的数组和函数调用出来?
2、通过输入参数传递数组。声明函数时提供空输入参数,调用函数时提供目标数组,即可以通过该数组调用子函数中的数组,该方法也可以用于传递多个参数。3、通过全局变量来传递数组。声明全局变量用于存储子函数中的数组,此时可以在全局变量作用域中读取调用子函数的数组。注意:子函数是C语言模块化编程思想的...
一个C语言程序是由哪几个部分组成,每一个
1、头文件:头文件包含程序中要调用的库函数。例如#include<stdio.h> 2、main函数:程序的主体部分,是整个C程序中必不可少的一部分。3、若干个子函数。需要实现诸多功能,如果仅在mian()函数中编辑,会造成程序可读性变差。
C语言,如何在子函数中写一个3*3二维数组,给主函数调用!!
在子函数申请二维数组,主函数使用,可以用动态申请。方法不止一种,我这里用指针的指针实现二维数组。二维数组除了行列,本身地址也是连续的,从第一行第一列的元素地址++,可以取出所有元素。所以我这里先申请了完整的连续地址。include<stdio.h>#include<malloc.h>int ** sr(void){ int i,j; ...
c语言中,一个函数可以调用其他函数,不能调用自己
错,函数可以调用自己,函数自己调用自己的这种调用方式称为函数的递归调用,我给你举个列子:int calc(int num){ if(num==0){ return 0;}else{ return num*calc(num-1);} } 这个函数就是利用递归求任意一个整数的阶乘
C语言 子函数和主函数的放置前后顺序区别?
修改是在#include<stdio.h>后面加 int square(int num);第二个问题:num是在main定义是可以在main作用域内直接使用,或者当做参数传递给子函数,你的问题num为什么可以在子函数中用,首先你子函数的num并非main里的num只是你把他们名字写成一样了;main里num是通过值传递给子函数的num,实际他们两个...
C语言中,同一个函数可以被定义多次吗?
可以这样写,其实最常见这样写法的是我们使用printf的时候 printf("max=%d",max(x,y));这是因为max是有返回值,这种写法就是将函数的返回值作为函数的参数。a=max(x,max(y,z));其实就是等价于 y = max(y,z);a=max(x,y);只是简化了写法而已。
在C语言程序中,func()是什么意思?
C语言程序中,func()指的是Function,表示子例程的一般性名词。在某些编程语言中,它指带返回值的子例程或语句。在一些编程语言中起着关键字的作用。将常用的代码以固定的格式封装(包装)成一个独立的模块,只要知道这个模块的名字就可以重复使用它,这个模块就叫做函数(Function)。函数的本质是一段...
c语言中,一个文件中的函数想用另一个文件中定义的结构体怎么办,用ex...
结构体在头文件中定义,然后要使用该结构体的源文件直接导入该头文件即可。例:结构体Node \/\/Node.h文件#ifndef NODE_H#define NODE_Hstruct Node{ int data; Node* next;};#endif\/\/main.cpp文件#include "Node.h"int main(){ struct Node n; n.data = 0; n.next = NULL...
线苑盐酸: 返回值只能有一个. 要返回多个, 最常用的方法是通过参数返回. 即参数用指针方式带回 也可以把多个变量写成结构体,然后返回结构体变量 推荐用参数带回的方式. 效率更高.
平川区19582757127: c语言中如何把一个子函数里的多个值返回到主函数中 - ?
线苑盐酸: #include<stdio.h> void fun(int *a,int *b) { int t; t=*a; *a=*b; *b=t; } void main() { int a=3,b=5; //int *pa=&a,*pb=&b; fun(&a,&b); printf("%d%d",a,b); //getch(); }
平川区19582757127: c语言一个函数返回多个值 - ?
线苑盐酸: 函数最终只能返回一个值!!! 你可以用“数组或指针”; 如 #include<stdio.h> void ser(int *x,int *y) {*x=20;//把改变后的结果传给主函数*y=30; } void main() {int a,b;a=1,b=2;ser(&a,&b);printf("a:%d b:%d\n",a,b);}
平川区19582757127: C语言中一个函数怎样返回多个值 - ?
线苑盐酸: 方法一:设置全局变量,这样你在形参中改变全局变量,在实参中也会有效.所以你可以在形参中改变多个全局变量的值,那么在实参中就相当于返回多个值.方法二:如果你用数组名作为形参,那么你改变数组内容,比如排序,或者进行加减运算,回到实参时依然是有效的.这样也会返回一组值.方法三:可以利用指针变量,这个原理和方法二是一样的,因为数组名本身就是数组首元素的地址.就不多说了.方法四:如果你学过C++,可以引用参数
平川区19582757127: c语言一个函数能否有两个返回值 - ?
线苑盐酸: 可以返回多个啊...
平川区19582757127: C语言:一个函数只能返回一个值吗? 如果不是,怎样返回多值? - ?
线苑盐酸: 返回一个数组就可以了.如果想返回不同类型的值,先定义个结构体,把要返回的值存入结构体变量,再把这个结构体变量返回就行了.
平川区19582757127: c语言一个函数能否有两个返回值 - ?
线苑盐酸: 应该是正确的,因为系统可能把a,b作为一个逗号表达式,返回逗号表达式的值b,不行的话,return (a.b);试试 你的语句可能正确,但你想让它返回a和b不可能,一个return 语句只返回一个值,执行完return,程序就结束
平川区19582757127: C或C++中一个函数能不能返回多个值? - ?
线苑盐酸: C系列语言是不能的,只能返回一个返回值.但纠正一下三楼的说法,不是所有语言都是这样,比如matlab就可以返回多个.如果在C++语言中需要返回多个值可以有以下三种方法:1、返回一个数组的首地址,那么可以把整个数组的元素返回....
平川区19582757127: C语言中自定义的函数可以一次返回多个值吗?就是用return一次返回多个值 - ?
线苑盐酸: 这个目前C语言还不支持.目前C语言的返回值只能是一种类型.如果想返回多个值的话,那楼主可以定义一个结构体类型,将结构体类型返回就可以了.实例代码如下:#include <stdio.h>#include <stdlib.h> struct return_test { int a; int b; }; struct ...
平川区19582757127: C语言的子函数怎么返回两个值 - ?
线苑盐酸: 函数是不能直接返回两个值的,不过可以通过数组,列表,链表等方式,返回多个值.例如 int a[] f(),这个函数返回值就是一个整型的数组,如果你要返回两个值,可以定义数组长度为2,a[0]保存第一个值,a[1]保存第二个值.