★データ構造(配列3)★


変数では変数同士で値の代入が可能でした。

ここでは、配列同士での値の代入について説明します。

次のプログラムを打ち込んで、実行してみてください。


<sample program 063-01>

#include <stdio.h>

int main(void)
{
    int data1[5] = { 1, 2, 3, 4, 5 };
    int data2[5];

    int i;

    data2 = data1;

    for (i = 0; i < 5; i++) {
        printf("data2[%d] = %d\n", i, data2[i]);
    }

    return 0;
}

配列data1に初期値を設定し、空の配列data2に代入(コピー)しようとしています。

しかし、コンパイル時にエラーメッセージが表示されますね。

  error C3863: 配列型 'int [5]' を割り当てることはできません。

これは、配列同士の代入はできないというメッセージだと思ってください。

イメージ的には一気に代入できそうな気がしますが、実際はできないのです。

では、どのようにすればできるようになるのでしょうか。

配列の各要素は「変数」ですから、1つずつ順番に代入することで配列全体をコピーすることができます。


<sample program 063-02>

#include <stdio.h>

int main(void)
{
    int data1[5] = { 1, 2, 3, 4, 5 };
    int data2[5];

    int i;

    for (i = 0; i < 5; i++) {
        data2[i] = data1[i];
    }

    for (i = 0; i < 5; i++) {
        printf("data2[%d] = %d\n", i, data2[i]);
    }

    return 0;
}

<実行結果>

data2[0] = 1
data2[1] = 2
data2[2] = 3
data2[3] = 4
data2[4] = 5
続行するには何かキーを押してください・・・

for文を使って繰り返しながら1つずつ代入します。

これで配列全体をコピーできました。


では、1つ問題を出します。

これまでやってきたことをすべて思い出しながら考えてください。


配列data1(要素数5個)に初期値{ 1, 2, 3, 4, 5 }を設定する。

配列data2を準備し、data1の内容を逆順にコピーして、結果を表示する。

代入する際にはfor文を使うこと!

<実行結果>

data2[0] = 5
data2[1] = 4
data2[2] = 3
data2[3] = 2
data2[4] = 1
続行するには何かキーを押してください・・・









































解答例です。


<sample program 063-03>

#include <stdio.h>

int main(void)
{
    int data1[5] = { 1, 2, 3, 4, 5 };
    int data2[5];

    int i;

    for (i = 0; i < 5; i++) {
        data2[i] = data1[4 - i];
    }

    for (i = 0; i < 5; i++) {
        printf("data2[%d] = %d\n", i, data2[i]);
    }

    return 0;
}

<実行結果>

data2[0] = 5
data2[1] = 4
data2[2] = 3
data2[3] = 2
data2[4] = 1
続行するには何かキーを押してください・・・

data1の内容を代入する際に、添え字を「4−i」にしています。

iは0から1ずつ増えていきますので、iと4−iの関係は以下のようになります。

  i 4−i
  −−−−−
  0  4
  1  3
  2  2
  3  1
  4  0

これを配列の添え字として書いてみると、

  data2[0] = data1[4];
  data2[1] = data1[3];
  data2[2] = data1[2];
  data2[3] = data1[1];
  data2[4] = data1[0];

このようになります。

data1の4番目の要素がdata2の1番目に代入され、data1の3番目の要素がdata2の1番目に代入され・・・と続いていきます。


図1 逆順に代入のイメージ

もちろん別の方法もあります。


<sample program 063-04>

#include <stdio.h>

int main(void)
{
    int data1[5] = { 1, 2, 3, 4, 5 };
    int data2[5];

    int i;

    for (i = 0; i < 5; i++) {
        data2[4 - i] = data1[i];
    }

    for (i = 0; i < 5; i++) {
        printf("data2[%d] = %d\n", i, data2[i]);
    }

    return 0;
}

<実行結果>

data2[0] = 5
data2[1] = 4
data2[2] = 3
data2[3] = 2
data2[4] = 1
続行するには何かキーを押してください・・・

添え字の扱いを逆にしただけですね。

他にも方法はあります。


<sample program 063-05>

#include <stdio.h>

int main(void)
{
    int data1[5] = { 1, 2, 3, 4, 5 };
    int data2[5];

    int i;
    int j;

    for (i = 0, j = 4; i < 5; i++, j--) {
        data2[j] = data1[i];
    }

    for (i = 0; i < 5; i++) {
        printf("data2[%d] = %d\n", i, data2[i]);
    }

    return 0;
}

<実行結果>

data2[0] = 5
data2[1] = 4
data2[2] = 3
data2[3] = 2
data2[4] = 1
続行するには何かキーを押してください・・・

変数jを新しく用意して、初期値に4を設定し、繰り返すごとに1減らしながら添え字として使うという方法です。

for文の説明時に「,」で区切ることで、初期値と増分は複数書けると説明しました。

他にもwhile文を使う等のバリエーションはありますが、とりあえず逆順に入っていればOKです。


次へ

戻る

目次へ