[C++] 配列を関数の引数として渡す方法
C++で配列を関数の引数として渡す方法には主に3つあります。
1つ目は配列のポインタを渡す方法で、関数の引数にポインタ型を指定します。
2つ目は配列のサイズを明示的に指定する方法で、引数に配列のサイズを追加で渡します。
3つ目はstd::arrayやstd::vectorなどのSTLコンテナを使用する方法で、これによりサイズ情報を含めて安全に渡せます。
配列を関数の引数として渡す基本
C++では、配列を関数の引数として渡すことができます。
配列を渡す際には、配列の先頭アドレスを渡すことになります。
これにより、関数内で配列の要素にアクセスすることが可能です。
以下に基本的な例を示します。
#include <iostream>
void printArray(int arr[], int size) {
    // 配列の要素を出力する
    for (int i = 0; i < size; i++) {
        std::cout << arr[i] << " ";
    }
    std::cout << std::endl; // 改行
}
int main() {
    int myArray[] = {1, 2, 3, 4, 5}; // 配列の初期化
    int size = sizeof(myArray) / sizeof(myArray[0]); // 配列のサイズを計算
    printArray(myArray, size); // 配列を関数に渡す
    return 0;
}1 2 3 4 5この例では、printArray関数が配列myArrayとそのサイズを引数として受け取ります。
関数内で配列の要素をループで出力しています。
配列のサイズは、sizeof演算子を使って計算しています。
std::arrayやstd::vectorを使用する方法
C++では、配列を扱うための便利なクラスとしてstd::arrayやstd::vectorが用意されています。
これらを使用することで、配列のサイズを動的に変更したり、より安全に配列を扱うことができます。
以下にそれぞれの使い方を示します。
std::arrayの使用例
std::arrayは固定サイズの配列をラップするクラスです。
配列のサイズはコンパイル時に決定されます。
#include <iostream>
#include <array>
void printArray(const std::array<int, 5>& arr) {
    // 配列の要素を出力する
    for (const auto& element : arr) {
        std::cout << element << " ";
    }
    std::cout << std::endl; // 改行
}
int main() {
    std::array<int, 5> myArray = {1, 2, 3, 4, 5}; // std::arrayの初期化
    printArray(myArray); // std::arrayを関数に渡す
    return 0;
}1 2 3 4 5std::vectorの使用例
std::vectorは動的サイズの配列を提供します。
要素の追加や削除が可能で、サイズを自由に変更できます。
#include <iostream>
#include <vector>
void printVector(const std::vector<int>& vec) {
    // ベクターの要素を出力する
    for (const auto& element : vec) {
        std::cout << element << " ";
    }
    std::cout << std::endl; // 改行
}
int main() {
    std::vector<int> myVector = {1, 2, 3, 4, 5}; // std::vectorの初期化
    printVector(myVector); // std::vectorを関数に渡す
    return 0;
}1 2 3 4 5std::arrayとstd::vectorを使用することで、配列の操作がより簡単かつ安全になります。
特にstd::vectorはサイズを動的に変更できるため、柔軟なプログラミングが可能です。
配列を関数に渡す際のベストプラクティス
配列を関数に渡す際には、いくつかのベストプラクティスを考慮することで、コードの可読性や安全性を向上させることができます。
以下に主なポイントをまとめました。
| ポイント | 説明 | 
|---|---|
| const修飾子の使用 | 配列を変更しない場合は、引数に constを付けて安全性を高める。 | 
| サイズを明示的に渡す | 配列のサイズを引数として渡すことで、関数内での範囲外アクセスを防ぐ。 | 
| std::arrayやstd::vectorの利用 | 固定サイズの配列には std::array、動的サイズの配列にはstd::vectorを使用する。 | 
| 参照渡しの活用 | 大きな配列を渡す際は、参照渡しを使用してパフォーマンスを向上させる。 | 
const修飾子の使用
配列を変更しない場合は、引数にconstを付けることで、意図しない変更を防ぎます。
以下の例では、constを使用して配列を安全に渡しています。
#include <iostream>
void printArray(const int arr[], int size) {
    for (int i = 0; i < size; i++) {
        std::cout << arr[i] << " ";
    }
    std::cout << std::endl; // 改行
}
int main() {
    int myArray[] = {1, 2, 3, 4, 5};
    int size = sizeof(myArray) / sizeof(myArray[0]);
    printArray(myArray, size); // 配列を関数に渡す
    return 0;
}サイズを明示的に渡す
配列のサイズを引数として渡すことで、関数内での範囲外アクセスを防ぎます。
これにより、バグを未然に防ぐことができます。
std::arrayやstd::vectorの利用
std::arrayやstd::vectorを使用することで、配列のサイズを動的に変更したり、より安全に扱うことができます。
これにより、メモリ管理の手間を軽減できます。
参照渡しの活用
大きな配列を渡す際は、参照渡しを使用することで、コピーのオーバーヘッドを避けることができます。
以下の例では、std::vectorを参照渡しで渡しています。
#include <iostream>
#include <vector>
void printVector(const std::vector<int>& vec) {
    for (const auto& element : vec) {
        std::cout << element << " ";
    }
    std::cout << std::endl; // 改行
}
int main() {
    std::vector<int> myVector = {1, 2, 3, 4, 5};
    printVector(myVector); // std::vectorを参照渡しで関数に渡す
    return 0;
}これらのベストプラクティスを守ることで、配列を関数に渡す際の安全性と効率性を向上させることができます。
まとめ
この記事では、C++における配列を関数の引数として渡す方法について詳しく解説しました。
配列を渡す際の基本的な方法から、std::arrayやstd::vectorを使用する利点、さらには配列を渡す際のベストプラクティスまでを取り上げました。
これらの知識を活用して、より安全で効率的なプログラミングを実践してみてください。
配列の扱い方をマスターすることで、C++のプログラミングスキルをさらに向上させることができるでしょう。
 
![[C++] 配列の要素数を動的に変更する方法](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47463.png)
![[C++] 配列の要素数を定数として扱う方法(constexprの活用)](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47462.png)
![[C++] 配列の要素数を指定せず、後で要素数を決める方法](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47460.png)
![[C++] 配列に定義できる最大要素数はいくらまで?](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47458.png)
![[C++] 要素数0の配列を作成する方法 – std::vectorの応用](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47456.png)
![[C++] 配列の要素数を取得する方法](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47455.png)
![[C++] 二次元配列の使い方をマスターする](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47454.png)
![[C++] 動的配列と静的配列の違いについて解説](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47453.png)
![[C++] 動的に作成した配列を初期化する方法](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47452.png)
![[C++] 配列を動的に生成して可変長配列を実装する方法](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47451.png)
![[C++] 配列に様々な方法で値を代入する方法](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47450.png)
![[C++] 配列の宣言と初期化について解説](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47449.png)