《C专家编程》:函数如何返回一个数组(九)
这节的内容比较少也比较简单,主要是觉得用的很少,所以单独提出来加深印象。主要涉及到函数如何返回一个数组的问题。还有关于内存的分配和扩展基础知识的复习。
一、如何使用指针从函数返回一个数组。
前几节,我们分析了怎么样把一个数组当参数传递给指针。本小节换个方向讨论数据的转化:从函数返回一个数组。严格的说,函数无法返回一个数组。但是可以让函数返回一个指向任何数据结构的指针,当然也可以是一个指向数组的指针,记住,声明必须在使用前。一个函数声明的例子如下:
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: "); 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(" "); 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! "); return ; } else { printf("realloc successfully! "); } } 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(" "); i=0; while(i<current_element) printf("%c-",arr[i++]); printf(" "); free(arr); system("pause"); return 0; }运行结果:
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: C++中函数返回值能否是数组?
- 下一篇: c++函数如何返回多值,返回数组的函数该如何调用
copyright © 2008-2019 亿联网络 版权所有 备案号:粤ICP备14031511号-2