C++使函数返回数组

来源:互联网 发布:ubuntu chrome 闪烁 编辑:程序博客网 时间:2024/06/10 05:35

ps:由于博主一直以来用的都是php,所以使用函数返回数组感觉很方便,最近刷题的时候,总是想着返回数组。另外吐槽,oj上的刷题系统的格式问题真是奇葩!一会要输出空格,一会不要空格,博主几乎崩溃。解几个水题爆炸难。
在知乎上看到一个好玩的,说C++里面数组是二等公民。想想也是,数组在C++的位置很尴尬,定长的数组几乎没什么意义,动态的数组又有太多限制。而且,C++又拥有一等公民,vector容器。
本着对数组的喜爱(php的习惯),准备写一篇关于C++返回数组的。

C/C++定义了4个内存区间:
代码区,全局变量与静态变量区,局部变量区即栈区,动态存储区,即堆(heap)区或自由存储区(free store)。
堆的概念:
通常定义变量(或对象),编译器在编译时都可以根据该变量(或对象)的类型知道所需内存空间的大小,从而系统在适当的时候为他们分配确定的存储空间。这种内存分配称为静态存储分配;
有些操作对象只在程序运行时才能确定,这样编译时就无法为他们预定存储空间,只能在程序运行时,系统根据运行时的要求进行内存分配,这种方法称为动态存储分配。所有动态存储分配都在堆区中进行。
当程序运行到需要一个动态分配的变量或对象时,必须向系统申请取得堆中的一块所需大小的存贮空间,用于存贮该变量或对象。当不再使用该变量或对象时,也就是它的生命结束时,要显式释放它所占用的存贮空间,这样系统就能对该堆空间进行再次分配,做到重复使用有限的资源。
数组放在函数体内部作为局部变量是栈分配,因此,直接返回一个数组是没什么意义的,数组在函数结束后内存就释放掉了。因此我们需要使用new向内存空间申请一块内存,这样,我们在返回数组指针的时候,就不会空指了。
在C++中,数组不是一种类型,因此不能被直接返回。一般有两种方法来返回一个数组。
1. 返回一个指向数组的指针

 #include<iostream>using namespace std;int* Array(){   int *a; a=new int [10]; for(int i=0;i<10;i++) {  a[i]=i+1;  cout<<a[i]<<" ";  } cout<<endl; return a;}void main(){ int *b; b=Array(); for(int i=0;i<10;i++)  cout<<b[i]<<" ";  cout<<endl;}
  1. 返回一个结构的形式。这种形式相对较安全,可以避免忘记释放指针而造成内存泄露,也可以避免访问悬挂指针造成的错误。但缺点是由于结构是先拷贝再返回,因此如果结构较大时,会影响效率和占用较大内存。
 #include<iostream>using namespace std;class tag{    public: int a[10];}X;class tag Array(){ for(int i=0;i<10;i++) {  X.a[i]=i+1;        cout<<X.a[i]<<" "; } cout<<endl; return X;}void main(){ class tag Y=Array(); for(int i=0;i<10;i++) {     cout<<Y.a[i]<<" "; }    cout<<endl;}
0 0