変数では変数同士で値の代入が可能でした。
ここでは、配列同士での値の代入について説明します。
次のプログラムを打ち込んで、実行してみてください。
<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です。