C++中函數返回值能否是數組?

什麼時候要返回數組呢?無非是我們對數組值進行了修改操作。

印象中,函數的返回值只能是一個值。不能是多個值。return語句也決定了只能返回一個值。

多數人討論認爲可以通過返回數組首地址,也就等同與返回指針。

其實指針也只是一個整型值,代表了數組首地址,不是數組值。


疑問一:那有了首地址能否索引到整個數組?

疑問二:返回了首地址,如果不是動態數組,數組會不會撤銷掉?導致返回了一個無效的數組指針?

數組需要在函數外定義。全局或者動態。


我們舉個例子實踐一下吧。

針對疑問二,我們定義一個內部函數數組實驗一下:

#include <iostream>

using namespace std;

float* Array(float *A,int length)
{
	float M[5];  //Array函數內部數組
	for (int i=0; i<length; i++)
           M[i]=A[i];
	return M;
}

int main()
{
    float A[5] = { 1.75, 0.25, 0, 0.75 ,2.5};
    float *M = Array(A,5);
	for (int i=0; i< 5; i++)
    cout << M[i] <<endl;
    cout << endl;

    return 0;
}
輸出結果是:
1.75
-1.07374e+008
-1.07374e+008
-1.07374e+008
-1.07374e+008
結果顯示:只輸出了數組首地址對應的數組值,其他數值都未輸出。

原因:因爲在函數中定義的數組M在函數執行完後已經被系統釋放掉了,所以在調用函數中得到的結果當然不是計算後的結果。

有一個解決辦法就是動態分配內存,在函數中new一個數組,這樣就不會被釋放掉了。


實驗二,聲明動態數組。

float* Array(float *A,int length)
{
	float *M=new float[5];  //Array函數內部動態數組,替換原來的 flaot M[5];
	for (int i=0; i<length; i++)
           M[i]=A[i];
	return M;
}

輸出結果:

1.75
0.25
0
0.75
2.5

結果正確。

實驗三,我們也直接採用外部數組進行操作,結果也顯示這樣是可以保證數值正確的。

#include <iostream>

using namespace std;

float* Array(float *A,int length)
{
	float temp;
   for(int i=0;i<length-1;i++)
	   for(int j=i+1;j<length;j++)
		   if(A[i]>A[j]){
			   temp=A[i];
			   A[i]=A[j];
			   A[j]=temp;
		   }
		   return A;
}

int main()
{
    float A[5] = { 1.75, 0.25, 0, 0.75 ,2.5};
    float *M = Array(A,5);
	for (int i=0; i< 5; i++)
    cout << M[i] <<endl;
    cout << endl;

    return 0;
}
輸出結果是:

0
0.25
0.75
1.75
2.5
//結果正確,可是長度是我們自己已經知道的。


以下是一些網友的解決辦法;

@langhaixin(這是大家最能想到的辦法,但是不能解決問題)

返回數組有兩種方法,一是把數組以引用的方式傳入,返回其首地址指針。
二是傳入數組首地址指針,返回其首地址指針

@chinafriend_xj

對數組也可按每個元素進行返回,主調程序利用循環進行控制,程序執行時間延長,但簡單隨意,亦可避免對指針的誤用.

@BlurEyes

如果返回的數組長度不定,爲什麼不用vector?


@Muf

這算是一種實現吧:

class myarr //實際上是一種smart pointer
{
public:
  myarr(int* p){m_ptr=p;}
  ~myarr(){delete[] p}
  int& operator[](...){...}
  //還有operator*
  //整數沒有operator->
  ...
};
myarr func(...)
{
  return new int[100];
}

void main()
{
  myarr arr = func(...);
  arr[10] = 123;
  std::cout<<arr[10];
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章