【C++】newで配列を初期化して0クリアする

この記事では、C++のnew演算子を使用して配列を初期化する方法と、配列の要素を0で初期化する方法について解説します。

初心者の方でもわかりやすく、サンプルコードと実行結果の例を交えて説明します。

目次から探す

new演算子で配列を初期化する方法

new演算子とは

C++において、new演算子は動的にメモリを確保するために使用されます。

配列を初期化する場合、new演算子を使用することで、指定した要素数の配列を動的に作成することができます。

new演算子を使用した配列の初期化方法

new演算子を使用して配列を初期化するには、以下のような形式で記述します。

データ型* 配列名 = new データ型[要素数];

例えば、int型の要素を5つ持つ配列を初期化する場合、以下のように記述します。

int* myArray = new int[5];

このコードでは、int型の要素を5つ持つ配列が動的に作成され、その先頭アドレスがmyArrayに格納されます。

配列の0クリア

配列を初期化する際に、要素を0で初期化することを0クリアと呼びます。

C++では、new演算子を使用して配列を初期化する際に、要素を0で初期化する方法がいくつかあります。

memset関数を使用した0クリア

memset関数は、指定したメモリ領域を指定した値で埋めるために使用されます。

配列を0で初期化する場合、以下のようにmemset関数を使用することができます。

#include <cstring>
int* myArray = new int[5];
memset(myArray, 0, sizeof(int) * 5);

このコードでは、memset関数を使用してmyArrayの先頭アドレスから要素数分のメモリ領域を0で埋めています。

ループを使用した0クリア

ループを使用して配列の要素を0で初期化する方法もあります。

以下のようにforループを使用して、要素を0で初期化することができます。

int* myArray = new int[5];
for (int i = 0; i < 5; i++) {
    myArray[i] = 0;
}

このコードでは、forループを使用してmyArrayの各要素を0で初期化しています。

memset関数を使用した0クリアは、配列の要素がバイト単位で0で埋められるため、int型などの複雑なデータ型の場合には正しく初期化されない可能性があります。

ループを使用した0クリアは、要素ごとに明示的に0で初期化するため、データ型に依存せず正確な初期化が行えます。

配列の0クリア方法

配列を0クリアする方法には、主に以下の2つの方法があります。

memset関数を使用した0クリア

memset関数は、指定したメモリ領域を特定の値で埋めるために使用されます。

配列を0クリアする場合には、memset関数を使用してメモリ領域を0で埋めることができます。

以下は、memset関数を使用して配列を0クリアする例です。

#include <iostream>
#include <cstring>
int main() {
    int arr[5];
    memset(arr, 0, sizeof(arr));
    // 配列の要素を表示
    for (int i = 0; i < 5; i++) {
        std::cout << arr[i] << " ";
    }
    return 0;
}

上記のコードでは、memset(arr, 0, sizeof(arr))という行で、配列arrの要素を0で埋めています。

その後、ループを使用して配列の要素を表示しています。

ループを使用した0クリア

もう一つの方法は、ループを使用して配列の要素を個別に0で初期化する方法です。

これは、C++の標準ライブラリを使用せずに配列を0クリアする方法です。

以下は、ループを使用して配列を0クリアする例です。

#include <iostream>
int main() {
    int arr[5];
    for (int i = 0; i < 5; i++) {
        arr[i] = 0;
    }
    // 配列の要素を表示
    for (int i = 0; i < 5; i++) {
        std::cout << arr[i] << " ";
    }
    return 0;
}

上記のコードでは、forループを使用して配列arrの要素を個別に0で初期化しています。

その後、ループを使用して配列の要素を表示しています。

memset関数を使用した0クリアは、メモリ領域全体を指定した値で埋めるため、大量のデータを0クリアする場合に効率的です。

一方、ループを使用した0クリアは、個別の要素を設定するため、配列のサイズが小さい場合や特定の要素のみを初期化する場合に適しています。

目次から探す