问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C语言自定义函数返回值的问题

发布网友 发布时间:2022-04-22 08:44

我来回答

3个回答

热心网友 时间:2023-07-11 21:33

方法1:利用全局变量
  
  分析:全局变量作为C语言的一个知识点,虽然我们都了解它的特点,但在实际教学过程中应用得并不是很多。由于全局变量的作用域是从定义变量开始直到程序结束,而对于编写有多个返回值的C语言函数,我们可以考虑把要返回的多个值定义成全局变量。当函数被调用时,全局变量被更改,我们再把更改后的全局变量值应用于主调函数中。函数被调用后被更改后的全局变量值即为函数的数个返回值。下面以一个实例演示该方法的应用。
  实例1:编写函数求3个数中的最大值与最小值。
  方法:把最大值、最小值分别定义成2个全局变量max、min,在用户自定义函数中把求出来的最大值与最小值分别赋给全局变量max、min。函数调用完毕后全局变量的max、min值即保存了函数要求返回的值。程序参考代码如下:
  #include "stdio.h"
  #include "conio.h"
  int max,min;/*定义两个全局变量用于保存函数返回值*/
  void max_min(int a,int b,int c) /*定义求最大最小值的函数*/
  {max=min=a; /*初始化最大最小值*/
   if(max   if(max   if(min>b)min=b;
  if(min>c)min=c;
  }
  main()
  {int x,y,z;
  printf(" 请输入3个整数:\n");
  scanf("%d,%d,%d",&x,&y,&z);
  max_min(x,y,z) ;/*调用求最大值与最小值的函数*/
  printf("三个数中的最大值为:%d;最小值为:%d",max,min);/*输出最大值与最小值*/
  getch();
  }
  调试结果如下:
  请输入3个整数:
  5,-6,2
  三个数中的最大值为:5;最小值为:-6
  注意:该方法虽然可以实现有多个返回值的函数,但由于全局变量不能保证值的正确性(因为其作用域是全局,所以程序范围内都可以修改它的值,如果出现错误将非常难以发现),并且全局变量增加了程序间模块的耦合,所以该方法要慎用。
  
 方法2:传递数组指针
  
  分析:在教学过程中,我们知道C语言函数参数的传递方式有值传递与地址传递。当进行值传递时,主调函数把实参的值复制给形参,形参获得从主调函数传递过来的值运行函数。在值传递过程中被调函数参数值的更改不能导致实参值的更改。而如果是地址传递,由于传递过程中从实参传递过来的是地址,所以被调函数中形参值的更改会直接导致实参值的更改。因此,我们可以考虑把多个返回值作为数组元素定义成一个数组的形式,并使该数组的地址作为函数的形式参数,以传址方式传递数组参数。函数被调用后,形参数组元素改变导致实参改变,我们再从改变后的实参数组元素中获得函数的多个返回值。以下实例演示该方法的应用。
  实例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
注意:该方法适用于多个返回值的数据类型一致的情况。当返回值数据类型不一致时,不适用该方法。

热心网友 时间:2023-07-11 21:34

你就别指望了,那是不允许的,也是不可能的。因为函数中的数组在函数返回后就不再受你的代码控制了,不仅可能得不到正确数据,而且有安全问题。不过你可以在函数中用动态法建立数组,最后把数组指针返回,在主调函数中使用。使用完之后别忘了释放那个数组。追问我上面代码中就是返回的数组指针,麻烦看看是哪里出问题了

追答就不用细看了。我已说过了,不能返回局部数组的指针。而且你也没有定义数组,q[]这叫什么?没有这样定义的。如果要返回函数中建立的数组指针,只能动态申请永久存在的空间。

热心网友 时间:2023-07-11 21:34

按照你的思路以及你给出的代码,编写了如下的程序,请参考。
#include <stdio.h>
void sort(int x[],int n) /*排序函数,x为传入的数组名,n表示数组下标数值*/
{
int i,j,temp;
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(x[i]<x[j])
{
temp=x[i];
x[i]=x[j];
x[j]=temp;
}
}
}
return;
}

int main()
{
int a[]={5,6,3},i,n;
n=3;
sort(a,n);
for(i=0;i<n;i++)
printf("%d ",a[i]);
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
八月中国最凉快的地方 八月份哪里最凉快,去哪旅游好?美丽的地方 乱字同韵字是什么意思 华硕笔记本电脑触摸板怎么开笔记本电脑触摸板怎么开启和关闭_百度知 ... 陕西职务侵占案立案准则 结婚后我的恋情维系了十年,怎么做到的? 玉米仁子饭产自哪里 中国期货交易所的交易品种有哪些? 历史要怎么读,有啥诀窍 高中历史诀窍 MT4编程:如何把一个函数自定义返回数组 那个自定义回复在哪设置啊 王二狗那个自定义回复是啥意思? 怎样设置自定义回复 苹果如何自定义返回键,不是返回手机桌面是返回应... 关于JAVA中自定义返回类型的用途 微信公众自定义回复怎么设置 谈谈通过CFA一级,FRM与其有什么区别和帮助 CFA,FRM区别到底有多大 FRM一级有效期是多久 FRM考试通过率历年是怎样的 FRM考试成绩合格率是怎么计算的 FRM考试考多少算通过 FRM考试多少分能通过 大家告诉我一下FRM考试成绩怎样才算通过呢?FRM考试... FRM二级考试评判标准是什么?FRM二级考试怎样算通过? FRM分数及格线是多少 frm正确率多少才能及格? 五万元的车贷分期卡,提前还了3000元,以后要怎样还款? 车贷还款方式是怎样的? 自定义函数的返回值是怎么回事 java 自定义类 返回值问题 自定义函数的返回值类型如果不写默认是返回int型吗... spring mvc中,RestController如何自定义返回的HTT... 点痣结伽要多久才会脱呢 电脑变成自定义模式怎么改回来 激光点痣结痂多久脱落? 自定义函数声明及返回值问题 激光点痣痂掉了之后多久才好! 在c语言中,自定义函数为何要返回值呢? 点痣结痂多久脱落 点痣结的痂多久会掉? 激光点痣之后,结的痂什么时候会掉呀?现在都第八... 激光点痣结痂后,大概要几天能脱痂? 激光点痣结痂后多久痂皮全部脱落? 激光点痣结痂到底多久掉啊 点痣后结痂要多久才会掉 点痣后多久结的痂才会掉?多久才能吃辣椒等食物? 肆无忌惮丿戦火 代表着什么? 显卡要超频吗