C++では、配列を関数に渡すときにいくつかの方法があります。
特に理解しておくべき重要なポイントは次の2つです。
- 配列とポインタの関係
- 配列サイズがどのように扱われるか
C++では配列をそのまま関数に渡すことが難しいため、多くの場合はポインタや参照などの形に変換されて渡されます。
そのため、配列の扱い方を理解することはC++の基礎として非常に重要です。
配列は関数引数ではポインタとして扱われる
C++では、関数の引数として配列を指定すると、内部的には配列の先頭要素を指すポインタとして扱われます。
これは言い換えると、関数には配列そのものがコピーされるわけではなく、配列の先頭位置を示す情報だけが渡されるということです。
ただし注意すべき点があります。
配列そのものはポインタ型ではなく、あくまで独立した配列型です。
しかし関数の引数という文脈では、配列型は自動的にポインタ型へと調整されるため、結果的にポインタとして受け取られる形になります。
この仕組みを理解していないと、配列を扱うときに誤解が生まれやすくなります。
配列サイズは自動では渡されない
配列を関数に渡す場合、要素数の情報は自動的には渡されません。
そのため、配列の要素数を知る必要がある場合は、一般的にサイズを別の引数として渡す必要があります。
この仕様はC言語から引き継がれている特徴であり、C++でも基本的な配列の扱い方として残っています。
サイズを渡さずに配列を扱うと、配列の範囲外にアクセスしてしまう危険があるため注意が必要です。
読み取り専用として配列を渡す
関数の中で配列の内容を変更しない場合は、読み取り専用として扱うことが推奨されます。
読み取り専用の指定を行うことで、関数内部で配列の要素が変更されることを防ぐことができ、プログラムの安全性が向上します。
また、このような指定を行うことで、その関数が配列をどのように扱うのかが明確になります。
配列参照として渡す方法
C++では、配列を参照として渡す方法もあります。
この方法を使うと、配列はポインタに変換されず、配列そのものを参照する形で関数に渡されます。
この方法の最大の特徴は、配列サイズが型の一部として保持されることです。
つまり、関数側では配列の要素数を型情報から知ることができるようになります。
ただし、この方法には制限があります。
特定のサイズの配列しか受け取れないため、汎用性はやや低くなります。
テンプレートを使った配列受け取り
C++ではテンプレートを使うことで、任意サイズの配列を安全に受け取ることが可能になります。
この方法では、配列の要素数がテンプレートのパラメータとして自動的に推論されます。
その結果、配列サイズを別の引数として渡す必要がなくなり、型安全性も向上します。
この方法は、生配列を扱う場合の比較的安全な手法のひとつです。
固定長配列を扱う場合(std::array)
C++では、生配列の代わりにstd::arrayというコンテナを使うことも一般的です。
std::arrayは次のような特徴を持っています。
- サイズが型に含まれている
- 標準ライブラリのアルゴリズムと連携できる
- メモリ配置が配列と同じ
このため、固定サイズのデータを扱う場合には、生配列よりも安全で扱いやすい選択肢になります。
可変長配列を扱う場合(std::vector)
配列のサイズが動的に変わる場合は、std::vectorがよく使われます。
vectorは標準ライブラリのコンテナであり、次のような特徴があります。
- 要素数を動的に変更できる
- メモリ管理を自動化できる
- STLアルゴリズムと組み合わせて使える
実務のアプリケーションでは、配列の代わりにvectorを使うケースが非常に多くなっています。
多次元配列を関数に渡す場合
2次元配列などの多次元配列を関数に渡す場合、配列の列数を指定する必要があります。
これは、配列の要素位置を計算するためには、1行あたりの要素数をコンパイラが知る必要があるためです。
つまり、行数は関数の引数として渡せますが、列数は型情報として決まっていなければなりません。
この点は、多次元配列を扱う際に混乱しやすい部分なので注意が必要です。
C++20以降の新しい方法(std::span)
C++20では、配列を関数に渡す方法としてstd::spanという仕組みが追加されました。
spanは、連続したメモリ領域を参照するための軽量なビューです。
spanを使うと、次のようなデータ構造を同じ方法で扱えるようになります。
- 生配列
- std::array
- std::vector
このように、異なるコンテナを共通のインターフェースで扱えるため、現代C++では非常に便利な手法として注目されています。
まとめ
C++で配列を関数に渡す方法には、いくつかの選択肢があります。
基本的な方法は、配列の先頭要素を指すポインタとして渡す方法です。
ただしこの方法では、配列サイズが自動では渡されないため注意が必要です。
より安全で現代的な方法としては、次のような選択肢があります。
- 配列参照を使う方法
- テンプレートを使って配列サイズを取得する方法
- std::arrayを使う方法
- std::vectorを使う方法
- std::spanを使う方法
用途に応じて適切な方法を選択することが、C++で配列を安全に扱うための重要なポイントになります。
以上、C++で配列を引数として渡す方法についてでした。
最後までお読みいただき、ありがとうございました。
