C++ 関数から配列を返す
C++ では、完全な配列を関数の引数として返すことはできません。ただし、インデックスを付けない配列名を指定することで、配列へのポインタを返すことができます。
関数から 1 次元配列を返したい場合は、ポインタを返す関数を宣言する必要があります。次のようにします。
次の例を参照してください:
サンプル
{
int myArray[3] = {1, 2, 3};
return myArray;
}
注意:ローカル配列へのポインタを単純に返すことはできません。関数が終了するとローカル配列は破棄され、それを指すポインタは無効になるからです。
C++ は、関数外でローカル変数のアドレスを返すことをサポートしていません。ローカル変数を次のように定義しない限り:static変数。
上記の状況を避けるには、静的配列または動的に割り当てた配列を使用できます。
静的配列を使用するには、関数内で静的配列を作成し、そのアドレスを返す必要があります。例えば:
{
static int myArray[3] = {1, 2, 3};
return myArray;
}
次に、10 個の乱数を生成し、配列を使用してそれらを返す以下の関数を見てみましょう。具体的には次のとおりです。
サンプル
上記のコードをコンパイルして実行すると、次の結果が生成されます:
624723190 1468735695 807113585 976495677 613357504 1377296355 1530315259 1778906708 1820354158 667126415 *(p + 0) : 624723190 *(p + 1) : 1468735695 *(p + 2) : 807113585 *(p + 3) : 976495677 *(p + 4) : 613357504 *(p + 5) : 1377296355 *(p + 6) : 1530315259 *(p + 7) : 1778906708 *(p + 8) : 1820354158 *(p + 9) : 667126415
動的に割り当てた配列を使用するには、関数内で new 演算子を使用して配列を割り当て、関数の終わりで delete 演算子を使用してその配列を解放する必要があります。例えば:
サンプル
{
int* myArray = new int[3];
myArray[0] = 1;
myArray[1] = 2;
myArray[2] = 3;
return myArray;
}
int main()
{
int* result = myFunction();
// result を使用
delete[] result;
return 0;
}
以下は、関数から配列を返す方法を示す簡単な応用例です:
サンプル
using namespace std;
int* createArray(int size) {
int* arr = new int[size];
for (int i = 0; i < size; i++) {
arr[i] = i + 1;
}
return arr;
}
int main() {
int* myArray = createArray(5);
for (int i = 0; i < 5; i++) {
cout << myArray[i] << " ";
}
cout << endl;
delete[] myArray; // メモリを解放
return 0;
}
上記の例では、整数パラメータ size を受け取り、整数で満たされた整数配列を返す createArray という名前の関数を宣言しました。new 演算子を使用してヒープ上に配列を動的に割り当て、関数内で配列を埋めました。最後に、関数は配列へのポインタを返しました。
main 関数では、createArray 関数を呼び出し、返された配列ポインタを myArray に格納しました。次に配列を走査して各要素の値を出力しました。最後に、メモリリークを避けるために、delete[] 演算子を使用して myArray が占有していたメモリを解放しました。
上記のコードをコンパイルして実行すると、次の結果が生成されます:
1 2 3 4 5
注意:動的に割り当てられた配列を使用する場合、関数を呼び出すコードが返された配列を解放する責任があります。これは、関数内で割り当てられた配列が関数の終了時に自動的に解放されないためです。
その他の拡張
C++ 配列