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];
}


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