【C言語】配列にほかの値を代入する方法を解説

C言語でプログラミングを始めると、配列の使い方は避けて通れない重要なポイントです。

このガイドでは、配列に値を代入する基本的な方法から、配列のコピー、多次元配列の操作、動的メモリ割り当てまで、初心者でもわかりやすく解説します。

具体的なサンプルコードとその実行結果を通じて、配列操作の基礎をしっかりと学びましょう。

目次から探す

配列への値の代入方法

C言語において、配列は同じデータ型の要素を連続して格納するためのデータ構造です。

配列に値を代入する方法はいくつかありますが、ここでは代表的な方法を紹介します。

直接代入

インデックスを使った代入

配列の各要素に値を代入する最も基本的な方法は、インデックスを使って直接代入する方法です。

インデックスは0から始まるため、最初の要素はインデックス0でアクセスします。

#include <stdio.h>
int main() {
    int array[5]; // 5つの要素を持つ配列を宣言
    // インデックスを使って値を代入
    array[0] = 10;
    array[1] = 20;
    array[2] = 30;
    array[3] = 40;
    array[4] = 50;
    // 配列の内容を表示
    for (int i = 0; i < 5; i++) {
        printf("array[%d] = %d\n", i, array[i]);
    }
    return 0;
}

このプログラムを実行すると、以下のように出力されます。

array[0] = 10
array[1] = 20
array[2] = 30
array[3] = 40
array[4] = 50

ループを使った代入

配列に多くの値を代入する場合、forループを使うと効率的です。

ループを使うことで、同じ処理を繰り返し実行できます。

#include <stdio.h>
int main() {
    int array[5]; // 5つの要素を持つ配列を宣言
    // ループを使って値を代入
    for (int i = 0; i < 5; i++) {
        array[i] = (i + 1) * 10; // 10, 20, 30, 40, 50を代入
    }
    // 配列の内容を表示
    for (int i = 0; i < 5; i++) {
        printf("array[%d] = %d\n", i, array[i]);
    }
    return 0;
}

このプログラムを実行すると、以下のように出力されます。

array[0] = 10
array[1] = 20
array[2] = 30
array[3] = 40
array[4] = 50

関数を使った代入

配列に値を代入する処理を関数にまとめることで、コードの再利用性が向上します。

以下の例では、配列に値を代入する関数を定義しています。

#include <stdio.h>
// 配列に値を代入する関数
void fillArray(int array[], int size) {
    for (int i = 0; i < size; i++) {
        array[i] = (i + 1) * 10; // 10, 20, 30, 40, 50を代入
    }
}
int main() {
    int array[5]; // 5つの要素を持つ配列を宣言
    // 関数を使って値を代入
    fillArray(array, 5);
    // 配列の内容を表示
    for (int i = 0; i < 5; i++) {
        printf("array[%d] = %d\n", i, array[i]);
    }
    return 0;
}

このプログラムを実行すると、以下のように出力されます。

array[0] = 10
array[1] = 20
array[2] = 30
array[3] = 40
array[4] = 50

関数を使うことで、配列のサイズや内容が変わった場合でも、関数内の処理を変更するだけで対応できます。

これにより、コードの保守性が向上します。

配列のコピー

配列のコピーは、ある配列の内容を別の配列にそのまま移す操作です。

C言語では、配列のコピーを行う方法として主にmemcpy関数forループを使った方法があります。

それぞれの方法について詳しく解説します。

memcpy関数を使ったコピー

memcpy関数は、標準ライブラリ<string.h>に含まれている関数で、メモリブロックをコピーするために使用されます。

配列のコピーにも非常に便利です。

memcpy関数の使い方

memcpy関数の基本的な使い方は以下の通りです。

#include <stdio.h>
#include <string.h>
int main() {
    int source[] = {1, 2, 3, 4, 5};
    int destination[5];
    // 配列のコピー
    memcpy(destination, source, sizeof(source));
    // コピー結果の表示
    for (int i = 0; i < 5; i++) {
        printf("%d ", destination[i]);
    }
    return 0;
}

このコードでは、source配列の内容をdestination配列にコピーしています。

memcpy関数の第1引数はコピー先の配列、第2引数はコピー元の配列、第3引数はコピーするバイト数です。

sizeof(source)を使って配列全体のバイト数を指定しています。

実行結果

1 2 3 4 5

このように、source配列の内容がdestination配列に正しくコピーされていることが確認できます。

forループを使った配列のコピー

forループを使って配列をコピーする方法もあります。

この方法は、配列の各要素を一つずつコピーするため、memcpy関数を使わない場合に便利です。

forループを使ったコピーの例

#include <stdio.h>
int main() {
    int source[] = {1, 2, 3, 4, 5};
    int destination[5];
    // 配列のコピー
    for (int i = 0; i < 5; i++) {
        destination[i] = source[i];
    }
    // コピー結果の表示
    for (int i = 0; i < 5; i++) {
        printf("%d ", destination[i]);
    }
    return 0;
}

このコードでは、forループを使ってsource配列の各要素をdestination配列にコピーしています。

実行結果

1 2 3 4 5

このように、forループを使ってもsource配列の内容がdestination配列に正しくコピーされていることが確認できます。

配列の一部に値を代入する方法

配列の一部に値を代入する方法について解説します。

配列全体に値を代入するのではなく、特定の範囲や部分に対して値を設定する方法を学びましょう。

部分的な代入

部分的な代入とは、配列の特定のインデックス範囲に対して値を代入することです。

例えば、配列の一部の要素だけを更新したい場合に使用します。

以下に、部分的な代入の例を示します。

#include <stdio.h>
int main() {
    int array[10] = {0}; // 配列を0で初期化
    // 配列の一部に値を代入
    for (int i = 3; i < 7; i++) {
        array[i] = 5;
    }
    // 配列の内容を表示
    for (int i = 0; i < 10; i++) {
        printf("%d ", array[i]);
    }
    return 0;
}

このプログラムでは、配列arrayのインデックス3から6までの要素に値5を代入しています。

実行結果は以下のようになります。

0 0 0 5 5 5 5 0 0 0

memset関数を使った部分代入

memset関数を使うと、配列の一部に同じ値を一括で代入することができます。

memset関数は、標準ライブラリ<string.h>に含まれており、メモリブロックを特定の値で埋めるために使用されます。

以下に、memset関数を使った部分代入の例を示します。

#include <stdio.h>
#include <string.h> // memset関数を使用するために必要
int main() {
    int array[10] = {0}; // 配列を0で初期化
    // 配列の一部に値を代入
    memset(array + 3, 5, 4 * sizeof(int));
    // 配列の内容を表示
    for (int i = 0; i < 10; i++) {
        printf("%d ", array[i]);
    }
    return 0;
}

このプログラムでは、memset関数を使って配列arrayのインデックス3から6までの要素に値5を代入しています。

実行結果は以下のようになります。

0 0 0 5 5 5 5 0 0 0

memset関数の第1引数には、代入を開始するメモリアドレスを指定します。

ここではarray + 3とすることで、配列のインデックス3から代入を開始しています。

第2引数には代入する値を指定し、第3引数には代入するバイト数を指定します。

ここでは4つのint型要素に対して代入するため、4 * sizeof(int)としています。

以上が、配列の一部に値を代入する方法とmemset関数を使った部分代入です。

これらの方法を使うことで、効率的に配列の一部を更新することができます。

多次元配列への値の代入

多次元配列の基本

多次元配列は、配列の中にさらに配列が含まれている構造を持つ配列です。

最も一般的な多次元配列は2次元配列で、これは行と列を持つ表形式のデータを表現するのに使われます。

例えば、行列やゲームのボードなどが2次元配列で表現されます。

多次元配列の宣言と初期化

多次元配列の宣言は、一次元配列の宣言と似ていますが、次元ごとに角括弧を追加します。

以下に2次元配列の宣言と初期化の例を示します。

#include <stdio.h>
int main() {
    // 2次元配列の宣言と初期化
    int matrix[3][3] = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };
    // 配列の内容を表示
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
    return 0;
}

このコードでは、3×3の2次元配列matrixを宣言し、初期化しています。

各行と列の要素を表示するために、ネストされたforループを使用しています。

多次元配列への値の代入

多次元配列への値の代入は、一次元配列と同様にインデックスを使用して行います。

次に、具体的な代入方法を見ていきましょう。

インデックスを使った代入

インデックスを使って多次元配列に値を代入する方法は、一次元配列と同じです。

以下に例を示します。

#include <stdio.h>
int main() {
    // 2次元配列の宣言
    int matrix[3][3];
    // インデックスを使って値を代入
    matrix[0][0] = 1;
    matrix[0][1] = 2;
    matrix[0][2] = 3;
    matrix[1][0] = 4;
    matrix[1][1] = 5;
    matrix[1][2] = 6;
    matrix[2][0] = 7;
    matrix[2][1] = 8;
    matrix[2][2] = 9;
    // 配列の内容を表示
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
    return 0;
}

このコードでは、インデックスを使って2次元配列matrixに値を代入しています。

ループを使った多次元配列への代入

多次元配列に値を代入する際に、ループを使うと効率的です。

以下に例を示します。

#include <stdio.h>
int main() {
    // 2次元配列の宣言
    int matrix[3][3];
    // ループを使って値を代入
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            matrix[i][j] = i * 3 + j + 1;
        }
    }
    // 配列の内容を表示
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
    return 0;
}

このコードでは、ネストされたforループを使って2次元配列matrixに値を代入しています。

各要素には計算式i * 3 + j + 1を使って値を設定しています。

ネストされたforループを使った代入

ネストされたforループを使うことで、多次元配列の各要素に効率的に値を代入できます。

以下に例を示します。

#include <stdio.h>
int main() {
    // 2次元配列の宣言
    int matrix[3][3];
    // ネストされたforループを使って値を代入
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            matrix[i][j] = (i + 1) * (j + 1);
        }
    }
    // 配列の内容を表示
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
    return 0;
}

このコードでは、ネストされたforループを使って2次元配列matrixに値を代入しています。

各要素には計算式(i + 1) * (j + 1)を使って値を設定しています。

以上が、多次元配列への値の代入方法です。

多次元配列を使うことで、より複雑なデータ構造を扱うことができるようになります。

ぜひ、実際にコードを書いて試してみてください。

配列の動的メモリ割り当てと代入

動的メモリ割り当ての基本

C言語では、配列のサイズをコンパイル時に決定する必要があります。

しかし、実行時に配列のサイズが変わる場合や、非常に大きな配列を扱う場合には、動的メモリ割り当てを使用することが一般的です。

動的メモリ割り当てを行うためには、標準ライブラリのstdlib.hをインクルードし、mallocfreeといった関数を使用します。

mallocfreeの使い方

malloc関数は、指定したバイト数のメモリを動的に割り当て、その先頭アドレスを返します。

割り当てられたメモリは、使用が終わったらfree関数で解放する必要があります。

以下に基本的な使い方を示します。

#include <stdio.h>
#include <stdlib.h>
int main() {
    int *array;
    int size = 10;
    // メモリの動的割り当て
    array = (int *)malloc(size * sizeof(int));
    if (array == NULL) {
        printf("メモリの割り当てに失敗しました\n");
        return 1;
    }
    // 配列の使用
    for (int i = 0; i < size; i++) {
        array[i] = i * 2;
    }
    // 配列の内容を表示
    for (int i = 0; i < size; i++) {
        printf("array[%d] = %d\n", i, array[i]);
    }
    // メモリの解放
    free(array);
    return 0;
}

このコードでは、malloc関数を使って整数型の配列を動的に割り当てています。

割り当てられたメモリが使用された後、free関数で解放されています。

動的配列への値の代入

動的に割り当てられた配列に値を代入する方法は、通常の配列と同じです。

インデックスを使って値を代入したり、ループを使って一括で代入することができます。

以下に、動的配列に値を代入する例を示します。

#include <stdio.h>
#include <stdlib.h>
int main() {
    int *array;
    int size = 5;
    // メモリの動的割り当て
    array = (int *)malloc(size * sizeof(int));
    if (array == NULL) {
        printf("メモリの割り当てに失敗しました\n");
        return 1;
    }
    // 配列に値を代入
    for (int i = 0; i < size; i++) {
        array[i] = i + 1;
    }
    // 配列の内容を表示
    for (int i = 0; i < size; i++) {
        printf("array[%d] = %d\n", i, array[i]);
    }
    // メモリの解放
    free(array);
    return 0;
}

この例では、malloc関数を使って動的に割り当てた配列に対して、forループを使って値を代入しています。

配列の内容を表示した後、free関数でメモリを解放しています。

動的メモリ割り当てを使用することで、実行時に配列のサイズを柔軟に変更できるため、メモリの効率的な利用が可能になります。

ただし、メモリの解放を忘れるとメモリリークが発生するため、free関数を使って適切にメモリを解放することが重要です。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

目次から探す