C++中函数返回值能否是数组?

来源:互联网 发布:如何卸载linux系统 编辑:程序博客网 时间:2024/05/29 17:39

什么时候要返回数组呢?无非是我们对数组值进行了修改操作。

印象中,函数的返回值只能是一个值。不能是多个值。return语句也决定了只能返回一个值。

多数人讨论认为可以通过返回数组首地址,也就等同与返回指针。

其实指针也只是一个整型值,代表了数组首地址,不是数组值。


疑问一:那有了首地址能否索引到整个数组?

疑问二:返回了首地址,如果不是动态数组,数组会不会撤销掉?导致返回了一个无效的数组指针?

数组需要在函数外定义。全局或者动态。


我们举个例子实践一下吧。

针对疑问二,我们定义一个内部函数数组实验一下:

[cpp] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. #include <iostream>  
  2.   
  3. using namespace std;  
  4.   
  5. float* Array(float *A,int length)  
  6. {  
  7.     float M[5];  //Array函数内部数组  
  8.     for (int i=0; i<length; i++)  
  9.            M[i]=A[i];  
  10.     return M;  
  11. }  
  12.   
  13. int main()  
  14. {  
  15.     float A[5] = { 1.75, 0.25, 0, 0.75 ,2.5};  
  16.     float *M = Array(A,5);  
  17.     for (int i=0; i< 5; i++)  
  18.     cout << M[i] <<endl;  
  19.     cout << endl;  
  20.   
  21.     return 0;  
  22. }  
输出结果是:
[cpp] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1.   
[python] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. 1.75  
  2. -1.07374e+008  
  3. -1.07374e+008  
  4. -1.07374e+008  
  5. -1.07374e+008  
结果显示:只输出了数组首地址对应的数组值,其他数值都未输出。

原因:因为在函数中定义的数组M在函数执行完后已经被系统释放掉了,所以在调用函数中得到的结果当然不是计算后的结果。

有一个解决办法就是动态分配内存,在函数中new一个数组,这样就不会被释放掉了。


实验二,声明动态数组。

[cpp] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. float* Array(float *A,int length)  
  2. {  
  3.     float *M=new float[5];  //Array函数内部动态数组,替换原来的 flaot M[5];  
  4.     for (int i=0; i<length; i++)  
  5.            M[i]=A[i];  
  6.     return M;  
  7. }  

输出结果:

[python] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. 1.75  
  2. 0.25  
  3. 0  
  4. 0.75  
  5. 2.5  

结果正确。

实验三,我们也直接采用外部数组进行操作,结果也显示这样是可以保证数值正确的。

[cpp] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. #include <iostream>  
  2.   
  3. using namespace std;  
  4.   
  5. float* Array(float *A,int length)  
  6. {  
  7.     float temp;  
  8.    for(int i=0;i<length-1;i++)  
  9.        for(int j=i+1;j<length;j++)  
  10.            if(A[i]>A[j]){  
  11.                temp=A[i];  
  12.                A[i]=A[j];  
  13.                A[j]=temp;  
  14.            }  
  15.            return A;  
  16. }  
  17.   
  18. int main()  
  19. {  
  20.     float A[5] = { 1.75, 0.25, 0, 0.75 ,2.5};  
  21.     float *M = Array(A,5);  
  22.     for (int i=0; i< 5; i++)  
  23.     cout << M[i] <<endl;  
  24.     cout << endl;  
  25.   
  26.     return 0;  
  27. }  
输出结果是:

[cpp] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. 0  
  2. 0.25  
  3. 0.75  
  4. 1.75  
  5. 2.5  
[cpp] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. //结果正确,可是长度是我们自己已经知道的。  


以下是一些网友的解决办法;

@langhaixin(这是大家最能想到的办法,但是不能解决问题)

返回数组有两种方法,一是把数组以引用的方式传入,返回其首地址指针。
二是传入数组首地址指针,返回其首地址指针

@chinafriend_xj

对数组也可按每个元素进行返回,主调程序利用循环进行控制,程序执行时间延长,但简单随意,亦可避免对指针的误用.

@BlurEyes

如果返回的数组长度不定,为什么不用vector?


@Muf

这算是一种实现吧:

[cpp] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. class myarr //实际上是一种smart pointer  
  2. {  
  3. public:  
  4.   myarr(int* p){m_ptr=p;}  
  5.   ~myarr(){delete[] p}  
  6.   int& operator[](...){...}  
  7.   //还有operator*  
  8.   //整数没有operator->  
  9.   ...  
  10. };  
  11. myarr func(...)  
  12. {  
  13.   return new int[100];  
  14. }  
  15.   
  16. void main()  
  17. {  
  18.   myarr arr = func(...);  
  19.   arr[10] = 123;  
  20.   std::cout<<arr[10];  
  21. }
0 0
原创粉丝点击