返回一个数组......而不是一个引用或指向数组的指针

时间:2012-12-26 20:33:57

标签: c++ arrays return

我有点困惑。有两种方法可以从方法返回数组。第一个建议如下:

typedef int arrT[10];
arrT *func(int i);

但是,如何捕获返回值为int(*)[]?

另一种方法是通过引用或指针:

int (*func(int i)[10];

int (&func(int i)[10];

返回类型是int(*)[]或int(&)[]。

我遇到的麻烦是如何分配一个变量来接受这一点,我继续得到如下错误:

can't convert int* to int (*)[]

知道我做错了什么或者我的知识缺乏什么?

3 个答案:

答案 0 :(得分:9)

如果要按值返回数组,请将其放在结构中。

标准委员会已经这样做了,因此你可以使用std::array<int,10>

std::array<int,10> func(int i);
std::array<int,10> x = func(77);

这使得通过引用返回非常简单:

std::array<int,10>& func2(int i);
std::array<int,10>& y = func2(5);

答案 1 :(得分:1)

首先,您提供的信息不正确。

你写,

  

“有两种方法可以从方法中返回一个数组”

然后你举例说明方式

typedef int arrT[10];
arrT *func(int i);

int (*func(int i))[10];

(我添加了缺少的右括号),你说后一种方式,与第一种方式相反,是

的一个例子
  

“通过引用或指针”

嗯,这两个声明意味着完全相同的,即:

typedef int A[10];
A* fp1( int i ) { return 0; }

int (*fp2( int i ))[10] { return 0; }

int main()
{
    int (*p1)[10]   = fp1( 100 );
    int (*p2)[10]   = fp2( 200 );
}

在这两种情况下都会返回指向数组的指针,并且此指针的类型为“指向数组的指针”。取消引用该指针会产生数组本身,它会再次衰减到指向自身的指针,但现在键入为“指向项目的指针”。它是指向数组第一项的指针。在机器代码级别,这两个指针在实践中完全相同。来自Pascal的背景让我困惑了很长时间,但结果是,因为在类型中携带数组大小通常是不切实际的(这排除了处理不同运行时大小的数组),大多数数组处理代码处理指向第一项的指针,而不是指向整个数组的指针。

即,通常这样的低级C语言函数将被声明为

int* func()

返回指向运行时建立的大小数组的第一项的指针。

现在,如果您想按值返回数组 ,那么您有两个选择:

  • 按值返回固定大小的数组:将其放入struct 该标准已经提供了一个模板化的类, std::array

  • 按值返回可变大小的数组:使用处理复制的类 该标准已经提供了一个模板化的类, std::vector

例如,

#include <vector>
using namespace std;

vector<int> foo() { return vector<int>( 10 ); }

int main()
{
    vector<int> const   v = foo();
    // ...
}

这是最普遍的。使用std::array更多地是针对特殊情况的优化。作为一个初学者,请记住Donald Knuth的建议:“过早优化是所有邪恶的根源。”即,只要使用std::vector,除非有一个非常合理的理由使用std::array

答案 2 :(得分:0)

using arrT10 = int[10]; // Or you can use typedef if you want

arrT10 * func(int i)
{
    arrT10 a10;
    return &a10;

    // int a[10];
    // return a;    // ERROR: can't convert int* to int (*)[]
}

这会给你一个警告,因为func会返回一个局部变量的地址,所以我们不应该像这样编码,但我确信这段代码可以帮助你。