【C++入門】関数から配列を返す方法|ポインタとstatic変数を使った実装テクニック
C++では、配列全体をそのまま関数の戻り値として返すことはできません。しかし、配列へのポインタを返すことで、実質的に同じ目的を達成することが可能です。
ここで注意すべき点が1つあります。関数内で宣言された通常のローカル変数(自動変数)は、関数の処理が終了すると同時にメモリから破棄されるため、そのアドレスを関数の外へ返しても正しく動作しません。
この問題を解決するのがstatic変数です。ローカル変数を static として宣言すると、その変数はプログラムの実行中ずっとメモリ上に保持されるため、関数が終了した後もアドレスを安全に参照できるようになります。
ポインタを返す関数の基本構文
配列へのポインタを返す関数は、以下のように記述します。
int * function_name()
{ body }各要素の意味は次のとおりです。
- function_name − ユーザーが自由に定義できる関数名です。
- 戻り値の型である
int *は、「int型へのポインタ」を返すことを示しています。
サンプルコード:関数から配列を返す例
それでは、実際に関数から配列を返すプログラムを見てみましょう。
#include <iostream>
using namespace std;
int * ret() {
static int x[3];
for(int i=0 ; i<5 ; i++) {
cout << " " << &x[i];
}
return x;
}
int main() {
ret();
return 0;
}実行結果
0x601180 0x601184 0x60118c 0x601188 0x601190
※出力されるアドレス値は、実行環境やコンパイラによって異なります。
コードの解説
このプログラムでは、配列を返す関数 ret() を定義しています。ポイントとなる部分を順番に見ていきましょう。
① static配列の宣言とアドレスの出力
int * ret() {
static int x[3];
for(int i=0 ; i<5 ; i++) {
cout << " " << &x[i];
}
return x;
}関数内で static int x[3] として静的なint型配列を宣言しています。static を付けることで、この配列は関数の呼び出しが終わってもメモリ上に残り続けます。
続くforループでは、各要素の先頭アドレスを &x[i] によって取得し、標準出力に表示しています。実行結果からも、各要素が4バイト(int型のサイズ)ずつ連続したアドレスに配置されていることが確認できます。
② main()関数からの呼び出し
main() 関数の中では、定義した関数を以下のように呼び出しています。
ret();
まとめ
- C++の関数は配列全体を直接返せないが、配列へのポインタなら返すことができる。
- ローカル変数のアドレスは関数外では無効になるため、static変数として宣言する必要がある。
- より現代的なC++では、
std::arrayやstd::vectorを使うことで、安全かつ簡潔に配列データを受け渡すこともできる。
-
JavaScript関数からオブジェクトを返す方法をわかりやすく解説
JavaScriptの関数からオブジェクトを返すには、return文を使用します。オブジェクト内のプロパティやメソッドにアクセスする際は、thisキーワードを活用すると便利です。この記事では、実際のコード例を使いながら、JavaScript関数からオブジェクトを返す基本的な方法を解説します。基本的な考え方JavaScriptでは、オブジェクトの中にメソッド(関数)を定義できます。そのメソッド内でreturn文を使えば、処理結果や値を呼び出し元に返すことができます。また、thisキーワードを参照することで、同じオブジェクト内の他のプロパティにアクセス可能です。サンプルコード以下のコードでは、従業
-
C++のnew演算子を使って2次元配列を動的に宣言・生成する方法
動的な2次元配列とは、基本的に「配列へのポインタ」を要素とする配列(ポインタの配列)のことです。つまり、各行が独立した1次元配列としてヒープ上に確保され、それらの先頭アドレスを格納するポインタ配列によって全体が管理されます。下図は、3×4の2次元配列のイメージです。アルゴリズムC++のnew演算子で2次元配列を動的に確保する手順は以下の通りです。Begin 配列の寸法(行数・列数)を宣言する。 new を使って 2次元配列 a[][] を動的に確保する。 配列に要素を代入する。 配列の内容を出力する。 delete でメモリを解放する。 Endサンプルコ