c语言函数可不可以返回多个值

作者&投稿:索姚 (若有异议请与网页底部的电邮联系)
C语言函数中能否有两个return?~

不能,函数的返回值只能有一个,所以程序执行到第一个return就直接跳出,没有执行return d;可以使用指针,a,b为入口参数,c,d为出口参数,这样就可以解决多个返回值的问题,希望能帮到你。
#include
void f(int a,int b,int *c,int *d)
{

*c = a + b;
*d = a - b;

}
int main()
{
int a = 5;
int b = 3;
int c=0,d=0;
f(a,b,&c,&d);
printf("%d %d",c,d);
return 0;
}

1、通过使用指针,在函数调用时,传递带有地址的参数,并使用指针更改其值;这样,修改后的值就会变成原始参数。

2、通过使用指针返回结果为:

3、通过使用结构:因为结构是用户定义的数据类型;可以定义一个包含两个整数变量的结构,并将更大和更小的值存储到这些变量中,然后使用该结构的值。

4、通过使用结构返回结果为:

5、通过使用数组,当一个数组作为参数传递时,基地址将传递给该函数,因此无论对数组副本所做的任何更改,都会更改为原始数组。

6、通过使用数组返回结果为:

在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\n \n",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("请输入学号,姓名,班别,总评成绩,以空格隔开:\n") ;
  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

可以返回多个值,方法是用引用型参数,也就是不用数值传递方式,而采用地址传递方式。如果采用v3.0以上版本,在形参前加上&,成为“ 类型 &形参名 ” 即可。

不可以
想传递回多个数,要么用全局变量,要么用地址传递。

你说的return a,b是返回逗号表达式a,b的返回值
如果
return a;
return b;
那么从第一个return函数就已经结束了。

不可以,你这样的话,只是返回了一个逗号表达式的值,即b的值
但是可以建立一个结构体
比如struct complex{double r;double i;};
这样的话直接返回一个该结构体类型的变量即可

另注:C99标准下是有复数类型

函数返回值一般用来判断函数调用失败与否的,接收数据一般是外面分配内存空间,传参数进去接收填写这段内存空间。如果你真要返回多个值,又不传参数去接受数据,可以返回指针。如:
typedef struct tagRETURN{
int a;
int b;
}RETURN,*PRETURN;
RETURN* fun_return_pointer()
{
RETURN* p=(RETURN*)malloc(sizeof RETURN);//堆中分配变量
//赋值p指向结构体;
return p;
}
//得到结构后,注意释放堆中内存;
但一般不推荐这样做。一般传参数给函数接收数据,如:
int fun_param_result(RETURN& rt) //或者参数传指针(RETURN* prt)
{
//给rt赋值
return 0;
}


C语言中return的作用是什么,能具体点吗
返回时可附带一个返回值,由return后面的参数指定。return通常是必要的,因为函数调用的时候计算结果通常是通过返回值带出的。 如果函数执行不需要返回计算结果,也需要返回一个状态码来表示函数执行的顺利与否(-1和0就是最常用的状态码),主调函数可以通过返回值判断被调函数的执行情况。

为什么c语言的main函数不能返回void类型?
提示main函数的返回值类型必须为int型。同时要在main函数结束执行前添加诸如return 0,之类的语句。void main() 是C++语言的话这类型是不标准的,改为int main()即可。任何时候都可以用int main(),所以建议不用void main(),用C++编译器编译C一般不会有什么问题,因为C++是兼容C的。总结一下就是,...

c语言函数的基本要求有
再者,每个C语言函数都必须有一个返回类型。这个类型指定了函数执行完毕后返回给调用者的数据的类型。如果函数不需要返回任何值,可以使用关键字`void`作为返回类型。例如,一个仅用于打印信息的函数可能声明为`void print_message`。而对于需要返回计算结果的函数,如上述的求和函数,返回类型则可能是`int`...

一般的C语言程序在什么情况下需要写返回值,什么情况下不需要写呢?
最开始必须声明下,大部分情况下都是要有返回值的,特别是你以后工作了写的一些程序。不过,也有少部分情况下是不需要返回值的,那就是你不太关心这个函数的具体运行情况,或者这个函数本身很简单,出错的几率太小了,又或者是初学者在练习的时候。比如部分close()类型的函数通常返回值都为void,比如show...

没有return语句的函数将返回什么
函数的指针和引用类型的参数也可以作为返回值。若函数体内没有return语句,则函数没有返回值1、c++ 函数没有return当然不会有返回值。return是C语言中的一个关键字,意为返回。return 就是用来被调函数返回到主调函数继续执行,返回时可附带一个返回值,由return后面的参数指定。2、函数的指针和引用类型...

c语言中函数里是不是遇到return语句就不再执行函数剩下的内容直接返回了...
是的。例如:fun1(){ return;printf("fun1");} fun2(){ fun1();printf("fun2");} main(){ fun2();}

c语言函数问题:1.不需要返回值的函数,即直接让函数输出某个值或符号...
关于函数返回多个值,有很多方法:一、不返回,函数返回值依然是void,但传值的时候传变量地址,那么在函数运行中改变变量地址里的值,函数运行结束,外面实参变量也改变了。比如void fun(int* a)。二、不返回,函数通过全局变量传递值。三、返回数组类型(包括结构数组),在函数中将要返回的多个值放在...

c语言中函数返回值可以是数组、字符串和结构体吗?
解决这种返回值的方法是通过指针来间接返回,即使用数组指针和函数指针。这可以做为c语言引入指针的另一个理由。2、字符串是数组的一种,是字符数组,所以同样不可以作为返回值。3、结构体类型可以做为返回值,C语言设计者当时引入struct结构体的概念,目的是为了增加一种建立C语言新类型的机制, 换句...

C语言函数中怎么返回一个二维数组
1、我们首先定义一个二级指针和一个行列变量[int ** array,row,column;]。2、然后我们编写进入行和列的语句,代码如图所示。3、接下来我们可以用一维数组打开一维一维数组。4、接下来,我们使用[array [i] =(int *)malloc(sizeof(int)* column);]来为数组再次生成包含该数组的新数组。5、...

C语言中返回值的作用,什么函数可以不需要返回值
2,str.length-1);} 然后你使用这个方法就会返回最后两位。。应该没写错把。。错了别拍我。这个看的懂把。我是自学C#的。C也看过,其实大致上都是差不多的。!没有返回值的话就相当于是一个过程存储在方法里。可以反复的利用。只要需要这个过程的时候。直接用这个方法就可以了。多省事。

鄢陵县13990409756: c语言一个函数能否有两个返回值 -
赫侵阿替: 应该是正确的,因为系统可能把a,b作为一个逗号表达式,返回逗号表达式的值b,不行的话,return (a.b);试试 你的语句可能正确,但你想让它返回a和b不可能,一个return 语句只返回一个值,执行完return,程序就结束

鄢陵县13990409756: C语言:一个函数只能返回一个值吗? 如果不是,怎样返回多值? -
赫侵阿替: 返回一个数组就可以了.如果想返回不同类型的值,先定义个结构体,把要返回的值存入结构体变量,再把这个结构体变量返回就行了.

鄢陵县13990409756: C或C++中一个函数能不能返回多个值? -
赫侵阿替: C系列语言是不能的,只能返回一个返回值.但纠正一下三楼的说法,不是所有语言都是这样,比如matlab就可以返回多个.如果在C++语言中需要返回多个值可以有以下三种方法:1、返回一个数组的首地址,那么可以把整个数组的元素返回....

鄢陵县13990409756: C语言中自定义的函数可以一次返回多个值吗?就是用return一次返回多个值 -
赫侵阿替: 这个目前C语言还不支持.目前C语言的返回值只能是一种类型.如果想返回多个值的话,那楼主可以定义一个结构体类型,将结构体类型返回就可以了.实例代码如下:#include <stdio.h>#include <stdlib.h> struct return_test { int a; int b; }; struct ...

鄢陵县13990409756: c语言一个函数能否有两个返回值 -
赫侵阿替: 可以返回多个啊...

鄢陵县13990409756: C语言中主函数是否有返回值,如果有,最多有几个? -
赫侵阿替: 有且必须要 C99以上标准规定主函数必须返回int 返回值可以有多个值但是只返回其中一个比如FILE *p = fopen(file_path); if (p==NULL)return 1; elsereturn 0; 这样主函数可以返回1或0,但是每次运行文件打开失败与否只返回其中一个

鄢陵县13990409756: 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);}

鄢陵县13990409756: C语言中,return语句可以返回多个值么? -
赫侵阿替: 额,,这个不可以,可以返回一个或者不返回

鄢陵县13990409756: C语言中一个函数怎样返回多个值 -
赫侵阿替: 方法一:设置全局变量,这样你在形参中改变全局变量,在实参中也会有效.所以你可以在形参中改变多个全局变量的值,那么在实参中就相当于返回多个值.方法二:如果你用数组名作为形参,那么你改变数组内容,比如排序,或者进行加减运算,回到实参时依然是有效的.这样也会返回一组值.方法三:可以利用指针变量,这个原理和方法二是一样的,因为数组名本身就是数组首元素的地址.就不多说了.方法四:如果你学过C++,可以引用参数

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网