このサイトは更新終了し, こちらに移行しています。

C言語入門: 配列変数

筑波大学農林工学系 奈佐原(西田)顕郎

ホーム


Cに限らず, 多くのプログラミング言語では, 複数個の変数に順番(番号)をつけて扱うことができる。このような変数(の集まり)を配列変数という。配列変数は, 数学で言うところの数列に似た概念である。

例えば, 7, 1, 8, 5という4個の整数からなるデータセットを扱うときに,

# include <stdio.h>        
main()
{
int a, b, c, d;
a=7;
b=1;
c=8;
d=5;
....
}
というふうにしてもよいのだが, それではアルファベットの数(26文字)よりも多いデータを扱うときにやっかいだ。それに, 「dって何番目のデータだったっけ?」というような混乱も起きるだろう。そこで, 以下のようにするとすっきりする:
# include <stdio.h>        
main()
{
int a[4];
a[0]=7;
a[1]=1;
a[2]=8;
a[3]=5;
....
}
ここで出てきたa[ ]という変数が, 配列変数である。[ ]の中に「頭から数えて何番目か」を与えてやることで, 任意の順番のデータを扱うことができる。ここで注意!「頭から数えて何番目か」は, 0から始まる。先頭は「0番め」であり, その次(常識的に考えたら2番めが)「1番め」である。

また, 配列変数を使うときには, まずそれを宣言しなければならない。それが上の例の

int a[4];                  
の部分である。ここでは整数型(int型)で4個の値をとれるような配列変数を宣言している。

では, 配列変数を使うプログラムの例として, 「4つの整数値を入力すると, 入力したのとは逆の順序で出力する」というプログラムを作ってみよう。

/* hairetsu.c */
/* compile: $ gcc hairetsu.c -o hairetsu */
/* 2010/07/07 K. Nasahara */
# include <stdio.h>
main()
{
int a[4];
int i;
for (i=0; i<4; i++){
  scanf("%d", &a[i]);
}
for (i=3; 0<=i; i=i-1){
  printf("%d\n", a[i]);
}
}
これをhairetsu.cという名前で保存し, コンパイルし, 実行してみよ。適当な整数を4つ与えると, その直後に, 4つの整数が逆の順番で表示されるだろう:
$ gcc hairetsu.c -o hairetsu
$ ./hairetsu
7
1
8
5
5
8
1
7

マジックナンバーを埋め込むな!

さて, 上で作ったhairetsu.cというプログラムは, とりあえず動くという点ではOKなのだが, プログラミングの「行儀作法」という点では, 悪い例である。というのも, 例えば「4つではなくて5つの整数を処理するように改造してほしい」と言われたときに, 変更・調整すべき数値が, ソースコードの中に散在しているからだ。なので, 本来は, 以下のように書くべきである(赤字部分が修正箇所):

/* hairetsu.c */
/* compile: $ gcc hairetsu.c -o hairetsu */
/* 2010/07/07 K. Nasahara */
# include <stdio.h>
# define N 4
main()
{
int a[N];
int i;
for (i=0; i<N; i++){
  scanf("%d", &a[i]);
}
for (i=N-1; 0<=i; i=i-1){
  printf("%d\n", a[i]);
}
}
こういうふうにすれば, defineの行でNの値を変えるだけで, 望むような改造ができる。

この例での「4」のように, プログラムのソースコードの中に記述された具体的な数値のことを「マジックナンバー」という。個々のマジックナンバーが「何の数」を意味するのかは, プログラムの作成者だけが把握しており, 他人の目には, 一見, 明らかではない。そのように, ソースコードをわかりにくくするような書き方は, よろしくないのである。マジックナンバーはソースコードの内部に埋め込んではならず, ソースコードの先頭で(できればコメントもきっちりつけて)定義するのが「お行儀」なのである。


(ブラウザの「戻る」ボタンで戻ってください)