2

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

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 (*)[]

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

4

3 回答 3

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);
于 2012-12-26T20:35:52.127 回答
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 );
}

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

即,通常像函数这样的低级 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.

于 2012-12-26T21:22:08.583 回答
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返回一个局部变量的地址,所以我们不应该这样编码,但我相信这段代码可以帮助你。

于 2016-05-31T18:54:46.860 回答