配列
同じ型の変数が並んだものを「配列」と言います。C以外でも多くの高級言語に採用されている。
通常の変数は
int num;
のように型と名前を示して宣言しますが、配列ではさらに要素数を加えて以下のように宣言します。
int num[10];
名前(上の例では”num”)が変数名で、それに続く[ ]内に示した”10″が、配列の要素数です。上記のように宣言すると
int 型の変数が10個確保され
その全体を“num”という名前で扱える
ようになります。
配列の各要素は添字(またはインデックス)と呼ばれる番号で一意に指定できます。Cでは先頭が0で、1ずつ増加します。
配列の走査
配列の各要素に規則性を持った値を代入するには、forループを使うのが便利です。例えば、10個の要素を持つint 型の配列に、100・200・300……と100ずつ増加する値を代入する処理は、リスト1のように記述できます。
カウンタ変数iは0から1ずつ増加するので、その値を配列の添字に使い、同時に(i + 1)の100倍を添字で示す要素の値として代入します。
継続条件は「i < 10」となっているので、iが9になるまでループが繰り返され、10になったら処理をせずにループを抜けるので、配列のすべての要素に値が代入されます。
リスト1:配列に100ずつ増加する値を代入していく
int num[10]; /* 整数を格納する配列 */
int i; /* カウンタ変数 */
for(i =0; i <10; i++){
num[i]=(i +1)*100;
}
配列の初期化
配列は同じ型の変数が並んだものですから、個々の要素の扱いは通常の変数と変わりません。配列の個々の要素に値を代入するには、以下のように代入演算子=を使います。
num[0]=100;
num[1]=200;
num[2]=300;
:
もちろん、通常はこんな悠長な記述はしません。配列の宣言時にすべての要素の値を示し、初期化することができます。
int num[]={100,200,300,400,500,600};
{ }内に値を「,」で区切って列挙するだけです。このようにすれば、[ ]内に最大要素数を示す必要はありません。{ }内に列挙した値の数だけの要素が自動的に確保されます。
配列のコピー
他の変数と同じように配列をコピーしたプログラム
/* 配列のコピー */
b = a; // エラーが表示され、コンパイルできません
for文を使って配列の要素をコピーしましょう。
#include <stdio.h> int main(void) { int i; int a[3] = {0, 1, 2}; int b[3]; /* 配列のコピー */ for(i=0;i<3;++i){ b[i] = a[i]; } printf("%d %d %d\n", b[0], b[1], b[2]); return 0; }
マクロ定数の活用
次のプログラムは,配列を宣言すると同時に初期化しておいて,その配列要素の数値の中で最大のものを表示する。
#include <stdio.h> #define N 10 /* 配列の要素数 */ int main() { int a[N] = {4, 2, 11, 4, 15, 7, 9, 12, 3, 6}; int i, max; max = a[0]; for (i = 1; i < N; i++) { if (max < a[i]) { max = a[i]; } } printf("max value = %d\n", max); return 0; }
max value = 15
プログラム中のfor文では,配列の要素を始めから見ていき, それまでに見つけた最大値 max
と,今注目している要素 a[i]
とを比較し, a[i]
の方が大きければ,max
の値をそれで置き直す。 また,max
には始めに a[0]
の値が入っており, a[0]
はmax
と比較する必要がないので, for文は i=1 から始まっている。
演習問題
- 演習5-3(p115) List5-5を書き換えて、先頭から順に5,4,3,2,1で初期化するプログラムを作成せよ。
- 演習5-4(p115) List5-6を書き換えて、配列aの要素の並びを逆順にしたものをbにコピーするプログラムを作成さよ。
- 演習5-5(p121) List5-8の配列の要素数をオブジェクト形式マクロで定義するように変更したプログラムを作成せよ。