首先,您提供的信息不正确。
你写,
“从方法返回数组有两种方法”
然后你举个例子
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()
返回指向在运行时建立的大小数组的第一项的指针。
现在,如果你想按值返回一个数组,那么你有两个选择:
例如,
#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
.