まず、あなたが提供する情報が間違っています。
あなたが書く、
「メソッドから配列を返す方法は 2 つあります」
そして、あなたは方法の例として挙げます
typedef int arrT[10];
arrT *func(int i);
と
int (*func(int i))[10];
(欠けている右括弧を追加しました)、この後者の方法は、最初の方法とは対照的に、
「参照またはポインタを介して」
さて、これら 2 つの宣言はまったく同じ意味です。
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 );
}
どちらの場合も、配列へのポインターが返され、このポインターは「配列へのポインター」として型指定されます。そのポインターを逆参照すると、配列自体が生成され、それ自体へのポインターに再び減衰しますが、「アイテムへのポインター」として型付けされます。配列の最初の項目へのポインタです。マシン コード レベルでは、これら 2 つのポインターは実際にはまったく同じです。長い間私を混乱させた Pascal のバックグラウンドから来ましたが、結果として、配列のサイズを型に含めることは一般に非現実的であるため (実行時のサイズが異なる配列を扱うことができなくなります)、ほとんどの配列処理コードは、配列全体へのポインタではなく、最初の項目へのポインタ。
つまり、通常、このような低レベルの C 言語のような関数は、次のように宣言されます。
int* func()
実行時に確立されたサイズの配列の最初の項目へのポインターを返します。
ここで、配列を値で返したい場合は、次の2 つの選択肢があります。
例えば、
#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
ください。