用c ++返回一个数组

时间:2010-02-20 13:13:21

标签: c++ arrays

假设我有一个数组

int arr[] = {...};
arr = function(arr);

我的功能为

 int& function(int arr[])
 {
//rest of the code
        return arr;
 }

我在这里犯了什么错误?

11 个答案:

答案 0 :(得分:7)

 int& function(int arr[])

在这个函数中,arr是一个指针,并且无法再将其转回数组。它与

相同
int& function(int* arr)

int arr[] = {...};
arr = function(arr);

假设函数设法返回对数组的引用,这仍然不起作用。您无法分配给数组。最好你可以将结果绑定到“X ints数组的引用”(使用typedef,因为语法会变得非常难看):

typedef int ten_ints[10];

ten_ints& foo(ten_ints& arr)
{
   //..
   return arr;
}

int main()
{
    int arr[10];
    ten_ints& arr_ref = foo(arr);
}

然而,完全不清楚你的问题中的代码应该达到什么目的。您对函数中的数组所做的任何更改都将对调用者可见,因此没有理由尝试返回数组或将其分配回原始数组。


如果你想要一个固定大小的数组,你可以分配和传递值(复制内容),那就是std::tr1::array(或boost::array)。 std::vector也是一个选项,但这是一个动态数组,因此不是完全等价的。

答案 1 :(得分:6)

正如其他人所说,有更好的选择,如STL容器,最有趣的问题是为什么你需要将数组返回到已经在范围内的函数。

话虽如此,你不能按值传递或返回数组,并且需要通过使用指针或对它的引用来避免数组衰减到指针(参见例如here):

int (&f(int (&arr)[3]))[3]
{
    return arr;
}

如果您不想硬编码大小,可以使用模板功能:

template<size_t n>
int (&f(int (&arr)[n]))[n]
{
    return arr;
}

答案 2 :(得分:4)

数组传递和返回的语义可能非常混乱。改为使用std :: vector。

答案 3 :(得分:3)

您将返回对int的引用,而不是对数组的引用。

你想:

(int*)& function(int arr[])
{
     /// rest of the code
     return arr;
}

那就像其他人已经说过的那样,这不是一种好的做法。

答案 4 :(得分:3)

以下作品,似乎并不凌乱或不易理解!

int* returnarray(int a[])
{
    for (unsigned int i = 0; i < 3; i++)
    {
        a[i] *= 2;
    }
    return a;
}

int main(int argc, char* argv[])
{
    int arr[3] = {1,2,3};
    int* p = returnarray(arr);
    for (unsigned int i = 0; i < 3; i++)
    {
        cout << "p[" << i << "] = " << p[i] << endl; 
    }
        cin.get();
        return 0;
}

答案 5 :(得分:1)

  • 作为参数的数组实际上是一个指针。如果作为参数
  • 给出,则数组会自动“转换”为指针
  • 您无法在C / C ++中将数组分配给另一个数组。您必须使用memcpy或循环来复制值。
  • 如果函数更改了arr参数,它实际上会更改调用者给出的arr变量的值。再次因为数组实际上是一个指针。所以在调用者arr被分配给arr,这在这里没用。

答案 6 :(得分:1)

我认为最好的办法是将其作为指向数组的指针返回。这是一个例子:

{
   ...
   int newLength = 0;
   int* arr2 = ChangeArray(arr, length, newLength);
   ...
   delete[] arr2;
}

int* ChangeArray(int arr[], int length, int& newLength)
{
   // reversing the number - just an example
   int* newArr = new int[length];
   for(int i = 0; i < length; i++)
   {
      newArr[i] = arr[length-i-1];
      newLength++;
   }
   return newArr;
}

答案 7 :(得分:0)

嗯,arr与int*兼容,而非int&。您的代码将无法编译。也许你想要return arr[0]

答案 8 :(得分:0)

您无法在C ++中将数组分配给另一个数组。考虑使用STL向量:http://www.cplusplus.com/reference/stl/vector/

答案 9 :(得分:0)

像这样使用std :: vector。

std::vector<int> function(const std::vector<int>& arr)
{
  return arr;
}

这样的数组
int arr[] = {...};

从函数返回没有用,因为它无法复制自身。

答案 10 :(得分:0)

如果没有必要,请不要使用它。你可以传递一个数组的引用,例如:

void foo(std::vector<int> &v) {
    for (int i = 0; i < 10; ++ i) {
        v.push_back(i);
    }
}

如果您使用:

std::vector<int> foo() {
    std::vector<int> v;
    for (int i = 0; i < 10; ++ i)
        v.push_back(i);

    return v;
}

将会有一个容器的复制过程,成本很高。

仅供参考:NRVO可能会消除成本