《C专家编程》:函数如何返回一个数组(九)

原创 2016年05月31日 16:47:57

      这节的内容比较少也比较简单,主要是觉得用的很少,所以单独提出来加深印象。主要涉及到函数如何返回一个数组的问题。还有关于内存的分配和扩展基础知识的复习。

一、如何使用指针从函数返回一个数组。

    前几节,我们分析了怎么样把一个数组当参数传递给指针。本小节换个方向讨论数据的转化:从函数返回一个数组。
严格的说,函数无法返回一个数组。但是可以让函数返回一个指向任何数据结构的指针,当然也可以是一个指向数组的指针,记住,声明必须在使用前。一个函数声明的例子如下:
int (*function())[20];

这里function是一个函数,它返回一个指针,该指针指向的是包含20个int类型元素的数组。

返回一数组的具体实现例子如下:

#include <iostream>
#include <stdlib.h>
using namespace std;
int (*function())[20]
{
	int i=0;
	int (*p)[20];//声明一个指向20个元素的指针;
	p=(int(*)[20])calloc(20,sizeof(int));
	//或者p=(int (*)[20])malloc(sizeof(int)*20);
	if(!p)//内存不够;
	{
		cout<<"the memory is not enough!"<<endl;
		return NULL;
	}
	for(i=0;i<20;i++)
		(*p)[i]=i+5;
	return p;
}
int main()
{
	int (*result)[20];
	result=function();
	if(result)
	{
		cout<<(*result)[3]<<endl;//这样访问结果,应该输出8。
		free(result);
	}
	system("pause");
	return 0;
}

运行结果如下:


或者定义这样一个结构体:
struct pp
{
 int arr[20];
}x,y;
struct pp function()  //结构体类型,返回一个结构体对象;
{
   return y;
}
x=y;
x=functoin();
如果要访问一个元素:可以用下面的方法:
x.arr[10]=100;
注意:千万不要返回一个指向函数的局部变量的指针。以前在这里有详细的讲解
函数可以返回的情况有:
(1)返回一个字符串常量;
(2)返回一个静态变量;
(3)返回一个全局变量;
(4)返回一个堆空间地址;
(5)最常用的就是(4)程序员自己申请一个堆区空间保存要返回的变量,然后返回。
二、使用指针创建和使用动态数组
    在很多情况下,我们并不知道数组的长度,而是使用动态数组。绝大多数的语言都支持在运行时设置数组的长度。他们允许程序员计算需要处理的数据的个数,然后申请刚好大小的数组能容纳这些数据。
    数组是静态的,数组的长度在编译期间已经确定不变。在这个领域,C语言支持很弱。你甚至不能用下面的形式:
const int number=10;
int array[number];//编译出错,期待一个整形常量表达式。
但是这样的语句在C++中是合法的。
1、现在我们来看一下如何实现动态数组,比较简单!
它的基本思路就是使用malloc()库函数来得到一大块内存的指针。然后,像引用数组一样引用这块内存,其机理就是一个数组下标访问可以改写一个指针加上偏移量。
具体代码实现如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
	int number;
	int *arr=NULL;
	int i=0;
	printf("please input the number of your array:\n");
	scanf("%d",&number);//根据具体的个数分配动态空间。
	arr=(int *)malloc(sizeof(int)*number);
	for(i=0;i<number;i++)
		arr[i]=i+5;
	for(i=0;i<number;i++)
		printf("%d-",arr[i]);
	printf("\n");
	system("pause");
	return 0;
}

输入5,运行结果:


     动态数组对于避免预定义的限制也是非常有用的。这样既可以避免空间的浪费,也可以避免内存不够用的尴尬。方便了程序员,但是一定要记住释放申请的内存,,不然会造成内存的泄漏(leak memeory)。

2、内存的扩展realloc()函数,比较简单,不要是为了练手,可能有些冗余,复习的时候可以跳过。

代码实现如下:

#include <stdio.h>
#include <stdlib.h>
int current_element=0;
int total_element=3;
char *arr=NULL;
void add_element(char c)
{
	if(current_element==total_element-1)
	{
		total_element*=2;
		arr=(char *)realloc(arr,total_element);
		if(NULL==arr)
		{
			printf("the memory is not enough!\n");
			return ;
		}
		else
		{
			printf("realloc successfully!\n");
		}
	}
	arr[current_element++]=c;
}
int main()
{
	int number;
	int i=0;
	char *add="ky";
	char array[10]="abcdefghi";
	arr=(char *)malloc(total_element);
	while(current_element < total_element-1)
		arr[current_element++]=array[i++];
	add_element(add[0]);
	add_element(add[1]);
	printf("\n");
	i=0;
	while(i<current_element)
		printf("%c-",arr[i++]);
	printf("\n");
	free(arr);
	system("pause");
	return 0;
}
运行结果:
     在笔记(八)里面用到了一个calloc(n,sizeof(value))函数,它和malloc(size)类似,但是它有两个参数,一个是变量的大小,一个是变量的个数,返回值是n个变量value的大小空间的首地址。主要适合用于数组指针的申请内存空间。
例如:
int (*p)[5];//p指向的是一个有5个int元素的内存空间;
p=(int (*)[5])calloc(5,sizeof(int));
................................

版权声明:本文为博主原创文章,未经博主允许不得转载。

在C中如何使函数返回数组

    Java语言的函数可以轻易的返回一个数组,而C/C++却不能直接返回一个数组。这是由于在C/C++中,数组不是一种类型,因此不能被直接返回。    在C/C++中,一般有两种方法来返回一个数组...
  • zouxinfox
  • zouxinfox
  • 2008年06月08日 21:07
  • 46208

C语言 -- 函数内局部数组

直接看这个例子void test() {     char b[25];     printf("%s/n",b);     b[0]= 'a';     b[1] = 'b';     ...
  • fxjtoday
  • fxjtoday
  • 2010年12月09日 11:08
  • 4113

c语言中函数能返回一个数组吗

 不能直接返回一个数组,但是可以用其他方式实现类似功能。 方法1:利用全局变量      分析:全局变量作为C语言的一个知识点,虽然我们都了解它的特点,但在实际教学过程中应用得并不是很多。...
  • Tiancaizhaohaiwei
  • Tiancaizhaohaiwei
  • 2016年03月12日 20:51
  • 4352

c语言,c++函数返回一个数组,二维数组

与其他高级语言相比,c语言,c++ 最大的不方便之处就是 函数只能返回一个数值。若要返回一个数组,必须用到指针以及动态分配内存。 这是一个坎,就如学吉他时的大横按一样,不少人在这个坎上望而却步。 我前...
  • robert_chen1988
  • robert_chen1988
  • 2016年12月10日 00:34
  • 5585

关于C语言函数返回数组的问题

关于C语言函数返回一个数组 c语言中函数不能直接返回一个数组,但是可以用其他方式实现类似功能,不过需要注意: 1、该数组不能是返回函数的局部变量数组,因为局部变量数组在退出函数后会被释放。 可以是全局...
  • earbao
  • earbao
  • 2016年11月29日 23:03
  • 8014

C/C++函数返回数组指针的一点点小姿势

数组指针问题一直是C/C++语言初学者的头疼问题,这里图图和大家分享一下函数返回数组的问题。如果在函数里定义静态数组,那么函数结束时数组内存空间也就会被释放,这时候如果返回数组首地址的话,那么获得的指...
  • u011106520
  • u011106520
  • 2014年03月29日 23:55
  • 1241

关于在C/C++语言中,函数如何返回数组,数组如何作为参数传递以及返回数组的函数该如何调用问题的总结

可能很多初学者对C语言中(C++类似),数组作为参数传递,和一个函数如何返回一个数组这类问题很迷惑,因为这里面涉及到指针问题,而初学者对指针了解甚少,更别说使用了。我也是刚刚需要实现一个简单算法才用到...
  • chief_cf
  • chief_cf
  • 2016年05月13日 18:08
  • 13691

子函数返回数组(指针和结构体)

有些时候需要子函数将一个数组返回出来,通常是两种方法,一种是靠指针,另一种是结构体。 一、先来看依靠指针怎么做 例程1: 1 #include "stdio.h" 2 3 char *...
  • u011426247
  • u011426247
  • 2016年08月08日 21:46
  • 1142

[编程之美]写一个函数,返回一个数组中所有元素被第一个元素除的结果

题目:     写一个函数,返回一个数组中所有元素被第一个元素除的结果; 错误的版本: void DivArray(int *array, int n) { for (int i = 0; i ...
  • ZongYinHu
  • ZongYinHu
  • 2015年07月25日 10:50
  • 1484

怎样让函数返回数组

用动态内存new和形参的方法让C++中函数返回一个数组
  • lijiayu2015
  • lijiayu2015
  • 2016年10月15日 10:23
  • 1495
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《C专家编程》:函数如何返回一个数组(九)
举报原因:
原因补充:

(最多只允许输入30个字)