我有点困惑。有两种方法可以从方法返回数组。第一个建议如下:
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 (*)[]
知道我做错了什么或者我的知识缺乏什么?
答案 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
会返回一个局部变量的地址,所以我们不应该像这样编码,但我确信这段代码可以帮助你。