C++の関数で配列を返す方法は何ですか?
イントロダクション
このチュートリアルでは、C++で関数から配列を返す方法を理解します。
C++関数で配列を返す方法
通常、関数呼び出しで配列全体を返すことはできません。ポインタを使用することでのみ可能です。
さらに、C++において戻り値の型がポインタであり、C型の配列のアドレスを返す関数を宣言すると、すべてのケースで正しく動作しないことがあります。コンパイラはローカル変数を返す際に警告を発し、出力結果に異常な振る舞いを示すことがあります。
したがって、C++で関数から配列を返すことは簡単ではありません。しかし、以下のいずれかの方法に従うことでそれを実現することができます。
さっそく始めましょう。
1. ポインタを使用する
前述のように、ポインタを使用して関数から通常の配列を返すと、予期しない結果が得られることがあります。ただし、このような動作や警告は、配列を静的に宣言することによって回避することができます。
どのようにするかな、見てみましょう。 (Dono you ni suru ka na, mite mimashō.)
#include<iostream>
using namespace std;
int* demo() //return type- address of integer array
{
static int a[5]; //array declared as static
for(int i = 0; i<5; i++)
{
a[i] = i; //array initialisation
}
return a; //address of a returned
}
int main()
{
int* ptr; //pointer to hold address
int i;
ptr = demo(); //address of a
cout<<"Array is: ";
for(i=0 ; i<5; i++)
cout<<ptr[i]<<"\t"; //ptr[i] is equivalent to *(ptr+i)
return 0;
}
出力:
Array is: 0 1 2 3 4
私たちは、int型のポインターを返す関数demo()を宣言しています。その定義では、main()関数呼び出し元の場所へのアドレスを配列の名前と基本アドレスとして返しています。
上記の出力からわかるように、配列は関数によって正常に返されています。
2. C++で構造体を使用する。
C++では、関数内の構造体内で宣言することによって、配列を返す関数も作成することができます。どのようにするか見てみましょう。
#include <iostream>
using namespace std;
struct demo
{
//array declared inside structure
int arr[100];
};
struct demo func(int n) //return type is struct demo
{
struct demo demo_mem; //demo structure member declared
for(int i=0;i<n;i++)
{
//array initialisation
demo_mem.arr[i] = i;
}
return demo_mem; //address of structure member returned
}
int main()
{
struct demo a;
int n=5; //number of elements
a=func(n); //address of arr
cout<<"The Array is : ";
for(int i=0;i<n;i++)
{
cout<<a.arr[i]<<"\t";
}
return 0;
}
結果:
Array is: 0 1 2 3 4
ここで、構造体demo内に配列arrを宣言したことに注意してください。そして、今回は関数の返り値の型が構造体自体であり、配列の代わりにdemo_mem(構造体変数)を返します。
こうすることで、別の構造変数aを使用して、main()関数内の配列arrにアクセスすることができます。
3. std::arrayを使用
C++のstd::arrayにおいて、関数から配列名を返すことは、実際には配列全体が関数呼び出し元に返されることを意味します。
#include <iostream>
#include<array>
using namespace std;
std::array<int,5> func() //function with return type std::array
{
std::array<int,5> f_array; //array declared
for(int i=0;i<5;i++)
{
//array initialisation
f_array[i] = i;
}
return f_array; //array returned
}
int main()
{
std::array<int,5> arr; //array with length 5
arr=func(); //function call
cout<<"The Array is : ";
for(int i=0;i<5;i++)
{
cout<<arr[i]<<"\t";
}
return 0;
}
出力:
Array is: 0 1 2 3 4
したがって、出力から明らかに、関数func()によって返された配列が成功したことがわかります。
結論
では、このチュートリアルでは、C++関数から配列を返すさまざまな方法について学びました。
追加の質問があれば、下のコメント欄をご利用ください。
参考文献
- C++ return array from function – StackOverflow Question,
- Two Dimensional Array in C++ – Journal Dev Post.