C语言中,一个子函数返回多个变量应该怎么写?

作者&投稿:狐岚 (若有异议请与网页底部的电邮联系)
C语言中,一个子函数返回多个变量应该怎么写~

返回值只能有一个。
要返回多个, 最常用的方法是通过参数返回。 即参数用指针方式带回
也可以把多个变量写成结构体,然后返回结构体变量
推荐用参数带回的方式。 效率更高。

在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

用 参数引用 的方式。
举例:

// main.cpp
#include <stdio.h>

void Func(int &aaa, int &bbb)
{
aaa = 4;
bbb = 5;
}

int main(int argc, char *argv[])
{
int a = 0, b = 0;

Func(a, b);
printf("a = %d, b = %d \r\n", a, b);

return 0;
}

struct def
{
int a;
float b;
double c;
char d;
long e;
}
然后返回一个struct def就可以了。

用指针效率比较高。但是要熟悉指针的用法。

只能定义一个结构,来返回多个数据。
或者返回一个指针。
看具体需求了。

函数只能返回一个变量


在C语言编程中,主函数在执行子函数里的while(1)时,突然定时中断来了...
可以的,定时中断的优先级较高,中断后会执行中断里面的程序,当中断里面的程序执行完成之后,你可以初始化定时器或者关闭定时器,程序就会从中断中退出,继续执行while中的程序

C语言中有 ^ 这个运算符吗?
有的,“^”是“位异或”。另外运算符号还有:()、 []、 -> 、 .、!、 ++、 --:圆括号、方括号、指针、成员、逻辑非、自加、自减 ++ 、 -- 、 * 、 & 、 ~ 、!:单目运算符 < 、 <= 、 > 、 >=:关系运算符

C语言中定义一个指向字符的指针数组char *s[5], 则*s[1],s[1],*(s...
void sort(char *s[]) 这里接收到的是指针数组,即:数组中各元素 是指针地址,s是数组首地址 s[i]表示第i+1个元素 的值(地址,一个字符串的首地址,* s[i] 表示这个字符串的第一个元素,是个字符)s+i是第i+1个元素的地址,*(s+i)是地址中的数据,等同于s[i]

C语言程序基础,请问return函数括号里面可以再放一个函数吗?求大神指点...
只要是合法的表达式,符合你的函数的定义,都可以放在你的return里,不仅可以放函数,函数本身也可以嵌套,比如说类似于return(eeprom_read(eeprom_test(xxx)))

c语言中如何一个函数的多次调用
一个函数只能有一个返回值,指针可以返回多个,例如:void aaa(){ int *a,*c;int a,c;a=a;*c=c;a=b();c=b();} 下面调用 *a和*c.

1、一个C语言程序是由( )。
一个C程序由一个主函数和若干个其他函数组成。若干个的意思就是可以有0个及以上个。c语言的程序模块称为函数。C 语言可以进行多种方式进行程序的设计,它是一种很有特色的高级语言通过若干个函数组成,它具备构成程序设计的 3 种基本结构顺序,选择和循环结构。C语言编辑简洁明了,运算符丰富且功能强大...

c语言.编写一个程序,包括主函数和如下子函数。
首先呢,排序和查找的代码分别来看都对了...其次呢,我要告诉你他们一联系起来,就出现了一个逻辑问题...然后呢,前两句是废话:你的问题在于sort排序是按从大到小排的,而你的二分查找的逻辑是如果当前中间那个数大于要查找的数 ,就往前面查找!!...前面的数不是更大么? 我们要的是更小的啊......

c语言中在一个自定义函数中怎么返回两个值?
方法一:设置全局变量,这样在形参中改变全局变量,在实参中也会有效。所以可以在形参中改变多个全局变量的值,那么在实参中就相当于返回多个值。方法二:如果用数组名作为形参,那么改变数组内容,比如排序,或者进行加减运算,回到实参时依然是有效的。这样也会返回一组值。方法三:可以利用指针变量,这个...

在java语言中,有时候变量常量声明时要加一个“static”,有的时候不加...
这段代码里面Tstatic类有一个static的int变量I,有两个构造函数,第一个用于初始化I为4,第二个用于初始化i为传进函数的值,在main中所传的值是5,程序首先声明对象的引用t,然后调用带参数的构造函数实例化对象,此时对象t的成员变量I的值为5,接着声明对象tt,调用无参数的构造函数,那么就把对象...

C语言编程,写一个函数,使输入的一个字符串按反序存放,在主函数中输入和...
第一,你在调用char yuan(char a)后,用什么来接受它的返回值?对吧,在主函数中根本没有任何char组来接受它。你似乎可以将 gets(a);后的语句改写成 a = yuan( a ); 然后输出。告诉你这也样行不同的,只因为接下来的第二点。第二,你的yuan函数设计有问题。你犯了一个初学者很容...

刚察县19565935338: C语言中,一个子函数返回多个变量应该怎么写 -
蒸昭茵陈: 返回值只能有一个. 要返回多个, 最常用的方法是通过参数返回. 即参数用指针方式带回 也可以把多个变量写成结构体,然后返回结构体变量 推荐用参数带回的方式. 效率更高.

刚察县19565935338: 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(); }

刚察县19565935338: 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);}

刚察县19565935338: C语言:一个函数只能返回一个值吗? 如果不是,怎样返回多值? -
蒸昭茵陈: 返回一个数组就可以了.如果想返回不同类型的值,先定义个结构体,把要返回的值存入结构体变量,再把这个结构体变量返回就行了.

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

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

刚察县19565935338: C语言的子函数怎么返回两个值 -
蒸昭茵陈: 函数是不能直接返回两个值的,不过可以通过数组,列表,链表等方式,返回多个值.例如 int a[] f(),这个函数返回值就是一个整型的数组,如果你要返回两个值,可以定义数组长度为2,a[0]保存第一个值,a[1]保存第二个值.

刚察县19565935338: c语言一个函数能否有两个返回值 -
蒸昭茵陈: 可以返回多个啊...

刚察县19565935338: 请高手指点:在c语言中如何用一个函数返回多个值? -
蒸昭茵陈: 用指针改变一个数组的 值 返回 这个指针或者 在 函数里面 修改全局变量 ``可以改变多个值

刚察县19565935338: c语言问题.如果想要在一个函数中同时返回3个数应该怎么编.感谢 -
蒸昭茵陈: 同时返回3个数不能用return了,因为遇到return会结束该函数,所以可以定义全局变量.

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