请问在C语言中数组可以作为返回值吗

作者&投稿:花阎 (若有异议请与网页底部的电邮联系)
c语言中如何使返回值为数组~

1、注意C/C++不能直接返回一个数组。这是由于在C/C++中,数组不是一种类型,因此不能被直接返回。
2、在C/C++中,一般有两种方法来返回一个数组。
第一种方法:
返回一个指向数组的指针,例如char (*retArray)[10]声明了一个函数retArray,该函数可以返回指向具有10个char元素的数组例子如下:#include#includeint (*retArray())[10]{int (*a)[10];int i=0;/*动态开辟空间*/
a=calloc(10,sizeof(int));/*赋值*/for(i=0;i<10;i++){(*a)[i]=i;}return a;}int main(){int (*b)[10];
/*函数返回指向数组的指针*/
b=retArray();
/*打印第一个元素*/
printf("%d/n",(*b)[0]);
/*释放空间*/free(b);return 0;}第二种方法:
如果你不喜欢用指针的形式返回数组,那么可以采用返回一个结构的形式。这种形式相对较安全,可以避免忘记释放指针而造成内存泄露,也可以避免访问悬挂指针造成的错误。但缺点是由于结构是先拷贝再返回,因此如果结构较大时,会影响效率和占用较大内存。
例子如下:#includestruct tag{int a[10];}x,y;struct tag retArray(){int i=0;for(i=0;i<10;i++)
x.a[i]=i;return x;}int main(){struct tag y=retArray();
printf("%d/n",y.a[3]);return 0;}注意:(1)在返回指针时要切记要避免内存泄露和访问悬挂指针。
(2)很多人认为指针和数组等价的,这是错误的。int (*a)[10]和int b[10]两者是不能直接用a=b来赋值的。在数组和指针作为函数参数传递时,二者可以认为等价,这是因为数组会被转化为指针来传递。
(3)返回多维数组方法类似。

不能直接返回一个数组,但是可以用其他方式实现类似功能。
方法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个整数:
");
  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

",A[0],A[5]);
  getch();
  }
  调试结果如下:
  请输入6个整形数,以空格隔开:
  5 8 9 32 -6 4
  max=32,min=-6
注意:该方法适用于多个返回值的数据类型一致的情况。当返回值数据类型不一致时,不适用该方法

返回数组是不行的(用malloc分配倒是可以但不安全),但你的要求却可以达到,那就是用指针
比如,输入a,返回b和c:
void fun(int a, int *pb, int *pc)
{
*pb = a - 1;
*pc = a + 1;
}

int main()
{
int a = 1;
int b, c;
fun(a, &b, &c);//输入a返回b=a-1,c=a+1两个结果
printf("a=%d,b=%d,c=%d",a,b,c);//输出结果是“a=1,b=0,c=2”
return 0;
}

不行的
<br>因为函数中的数组只是个临时变量, 函数一结束它也就消失了.
<br> 就算把它当指针返回也不行的, 虽然程序编译没错, 但指针已指到其它地方去了

方法有很多呀, 以int类型为例
1)
int* RetTwoVal()
{
int *p = (int*)malloc(sizeof(int)*2);
if (p == NULL)return NULL;
p[0] = 1;
p[1] = 2;
return p
}

int *pVal = RetTwoVal();
if (pVal != NULL)
{
//使用
free(pVal);;//在用完p后要记得释放
}
2)
void RetTwoVal(int *retval)
{
retval[0] = 1;
retval[1] = 2;
}
int arr[2];
RetTwoVal(arr);
//使用

可以考虑返回指针。

除了用指针还可以用结构体封装一下:
typedef struct array {
int arr[10];

} ARRAY;
ARRAY fun();
int main(){
ARRAY res = fun();

// res.arr is what you need

}


在c语言中怎样从数组中取出一个数
在c语言中,无法直接返回一个数组,但是可以通过返回对应类型指针的方式,返回数组。在大多数情况下,一维数组和一维指针是可以通用的。比如,定义一个函数,申请一定长度的整型动态数组,其长度用参数传入,并将结果返回。如出错,返回空指针null。代码可以写成如下形式:int *int_array_create(int n)\/\/...

在C语言中,数组a[5],数组名a可以a++吗
不能。因为变量指针可以递增,而数组不能递增,数组可以看成一个指针常量。代码修改:include<stdio.h> int main(void){ int array[5]={2,4,5,23,5};int *p,i;p=array;printf("请输入是五个数:\\n");for(i=0;i<5;i++)scanf("%d",&array[i]);printf("\\n");printf("输出五个...

9、在C语言中,引用数组元素时,其数组下标的数据类型允许是
B整型表达式 比如:int a。下标就可以是常量。i=8,j=9。a[i+j]也行,下标i+j就是整形表达式。引用数组中元素通过数组的下标,如 a(10),其中10 即数组下标。有的数组的下标是0开始的,那么要引用第一个元素,要使用0下标,如a(0)。

c语言中,数组元素的下标下限为
c语言中,数组元素的下标下限为0。 数组中的各元素的存储是有先后顺序的,它们在内存中按照这个先后顺序连续存放在一起。数组元素用整个数组的名字和它自己在数组中的顺序位置来表示。例如,a[0]表示名字为a的数组中的第一个元素,a[1]代表数组a的第二个元素,以此类推。 对于VB的数组,表示数组元素时应注意:下标...

数组的定义是什么?
(2)数组可被看成定长的线性表,因此数组中的数据元素的个数是固定的。2.数组分类根据数组元素ai的组织形式的不同,数组可分为一维数组、二维数组以及多维数组。1.一维数组一维数组可被看成一个线性表或一个向量,它在计算机内存放在一块连续的存储单元中,在C语言中一维数组一般定义为:数组名[下标...

c语言中定义数组的时候可不可以缺省数组长度 ,在用户输入任意字符后让系...
(1)你可以定义一个长度长于需要的数组,例如: char str[500];或者 (2)运行时,输入长度,做动态分配,再输入数据 ,例如:char *str; int n;printf("input length n: "); scanf("%d",&n);str = malloc(sizeof(char) * n);或者 不知道长度,完全随机, 那么 (3) 用 ...

在C语言中,如何统计一维数组中重复频率最多次的元素,(数组中可能存在多...
include <stdio.h> include <stdlib.h> struct VALUE_INFO { int nValue;int nCount;struct VALUE_INFO *pNextInfo;};void main(){ unsigned short arr[] = {1, 2, 2, 4, 5, 6, 6, 6, 6, 7, 8, 8, 9};int MAX_SIZE = sizeof(arr) \/ sizeof(short);struct VALUE_INFO *p...

C语言数组从键盘输入10个整数存入数组,找出其中最大和最小值,并输出...
在C语言中,一个程序可以通过键盘输入10个整数,并将它们存储在一个数组中。接着,程序会找出数组中的最大值和最小值,并将这两个数值输出。以下是这个过程的代码实现:#include<stdio.h> intmain(){ inti;floatnum[10];printf("请输入10个数,每输入一个数按回车键结束:\\n");for(i=0;...

在c语言二维数组中怎样交换两个数组元素中的字符串,请写代码._百度知 ...
其他回答 char c[20];strcpy(c, b);strcpy(b, a);strcpy(a, c); mekinglong | 发布于2008-09-29 举报| 评论 0 2 为您推荐: 二维数组的长度 指针数组 二维数组初始化 二维数组地址 c语言二维数组[0] 二维数组名 输出二维数组 c语言数组长度 c语言二维数输入 c语言定义二维数组 ...

c语言的数组中能不能包含未知数?
你一开始就定义 int a[6][6];for(int i = 0; i < 6; i++){ for(int j = 0; j < 6; j++){ a[i][j] = fun(***);} } 你没有定义一个数不代表这个位置不能存在一个随机数呀。像一般的电脑里面没有被初始化的静态数组里面都是有数字的,但是你想用的时候第一步就是对这...

连山壮族瑶族自治县18766225862: 请问在C语言中数组可以作为返回值吗 -
弘英易齐: 返回数组是不行的(用malloc分配倒是可以但不安全),但你的要求却可以达到,那就是用指针 比如,输入a,返回b和c: void fun(int a, int *pb, int *pc) { *pb = a - 1; *pc = a + 1; }int main() { int a = 1; int b, c; fun(a, &b, &c);//输入a返回b=a-1,c=a+1两个结果 printf("a=%d,b=%d,c=%d",a,b,c);//输出结果是“a=1,b=0,c=2” return 0; }

连山壮族瑶族自治县18766225862: C语言中,整个数组可以作为函数的返回值吗? -
弘英易齐: 你好,返回数组名返回的只能够是数组在内存空间中的首地址位置 建议楼主可以建立全局数组,这样就可以在局部函数中修改数组的值了 有不懂的可以追问~

连山壮族瑶族自治县18766225862: c语言中函数能返回一个数组吗 -
弘英易齐: 在C语言中,无法直接返回一个数组,但是可以通过返回对应类型指针的方式,返回数组. 在大多数情况下,一维数组和一维指针是可以通用的.比如,定义一个函数,申请一定长度的整型动态数组,其长度用参数传入,并将结果返回.如出错,返回空指针NULL. 代码可以写成如下形式: int *int_array_create(int n)//参数n为数组元素个数 { int *r; if(n<=0) return NULL;//参数错误 r = (int *)malloc(sizeof(int)*n);//申请内存空间,大小为n个int长度. return r;//返回得到的整型数组的指针. }

连山壮族瑶族自治县18766225862: C语言中,函数返回值可以是数组? -
弘英易齐: 可以为指针或着说是地址. 因为对于数组来说只需要传递数组的某个地址例如传递数组a[] 的a或者任意一个地址&a[4]等

连山壮族瑶族自治县18766225862: C语言自定函数内定义一维数组,为什么不能将数组名作为返回值? -
弘英易齐: 并不是一定不能返回,而是要区分定义的一维数组类型. 1 当一维数组为静态类型时,即 static type var[N]; 的形式,这时是可以将数组名返回的.2 当一维数组不是静态类型,即不存在static修饰时,数组为局部变量,这时不能将数组名返回.当把数组名返回时,实际上是返回了数组的首地址,后续继续使用该地址指向的内存.如果数组为局部变量,那么按照C语言的规则,该段地址在退出函数后,会被释放,并可能被系统做其它用途,这样再继续访问该段地址就会引起不可预知错误.所以对于局部数组名是不可以返回的. 而静态局部变量,开辟的空间不会在退出函数后释放,这时可以返回.

连山壮族瑶族自治县18766225862: c语言自定义函数的返回值可以是数组吗 -
弘英易齐: 不可以,不过你可以用指向数组的指针

连山壮族瑶族自治县18766225862: C语言中动态分配的数组可以作为函数返回值返回吗 -
弘英易齐: 都可以,不过你动态分配的内存什么时候释放是个问题

连山壮族瑶族自治县18766225862: c语言怎么返回字符串数组? -
弘英易齐: C语言返回值不支持返回数组,不过可以通过返回指针类型,用以替代数组.在C语言中,数组大多数时候是可以用指针替代的.不过需要注意的是,不能够返回在函数内部定义的局部变量数组,因为一旦函数退出,局部变量就会被释放,导致数组指针无效. 可以返回以下几种: 1 全局变量,或者全局变量空间内的一个地址. 2 静态局部变量,或者静态局部变量内部的一个地址. 3 从参数传入的数组/指针变量,或者在其上做的合法偏移. 4 在数组内部动态申请的空间首地址.

连山壮族瑶族自治县18766225862: c语言作业:调用一个函数,要求参数和返回值都是数组并在子函数中对该数组排序 -
弘英易齐: 不能够返回整个数组,只能返回数组中的某个值.如果数组在函数内部定义,也不能直接返回数组名(临时变量在函数结束时会释放).一般写程序不会把数组作为返回值返回,想要返回整个数组,可以用指针来实现.

连山壮族瑶族自治县18766225862: C语言中函数的返回值可不可以是数组,如果可以应该怎么设置参数?请高手回答!!! -
弘英易齐: 可以的,用指针做返回值 int * array(int *a){ for(i=0;i

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