2 配列の必要性と基本的な使い方

2.1 たくさんの値を記憶する必要性

コンピュータでは,データを記憶する場所には,プログラマーが名前を付ける必要がある. そうしないと,プログラマーは記憶したデータを取り扱うことができない.これまでに, 諸君は単純型と言われるデータ構造を学習した.それを使うためには,記憶するデータの 型と変数名をプログラムの最初に記述する.次のようにである.
	
	int a;
	double x;

このようにいちいち名前を指定する方法だと,大量のデータを処理することは不可能であ る.たとえば,100万個の名前を付けるだけで,大変である.困った,さあどうするか?

2.2 配列の宣言

先ほどのデータ構造--単なる変数--で,大量のデータを扱うことは不可能である.なぜ ならば,単なる変数で一度に確保できるメモリーの領域は1個であるため,全てのデータ に異なった名前を付けることは不可能となるからである.ようするに,100万個のデータ を扱う場合,それだけの変数名を用意するのはナンセンス.そこで,複数の同じ型のデー タを取り扱うために,配列というデータ構造が発明された.

これは,同じ型のデータを任意の個数宣言し,配列名と自然数でアクセスすることができ るようにしたものである.配列宣言を使う場合の宣言は,型名と配列名,そしてサイズを 書く.
書式(配列の宣言方法)
	データ型名 配列名[サイズ];
	データ型名 配列名[サイズ][サイズ];
	データ型名 配列名[サイズ][サイズ][サイズ];

具体的には,次のようにする.

	int i[10], j[100][100];

こうすると, -4pt となる.C言語では配列の添字(インデックス)は,ゼロからはじまることに注意が必要で ある.

C言語では,配列のデータは連続したメモリー領域に格納される.すなわち,先ほどの例 の場合,図1のようにメモリー領域が確保される.連続したメモリー 領域をつかうので,配列へのデータの出し入れは高速にできる.

図 1: 配列のイメージ.データを入れる箱がいっぱいある.ただしひとつの箱の大きさは全 て同じで整数を格納する.
\includegraphics[keepaspectratio, scale=0.8]{figure/image_array.eps}

2.3 配列の初期化

配列のサイズが小さい場合,宣言と同時に初期ができる.
	int hoge[3]={111,222,333};
	int fuga[2][2]={{111,222},{333,4444}};

このようにすると,

  hoge[0]=111   hoge[1]=222   hoge[2]=333    
  fuga[0][0]=111   fuga[0][1]=222   fuga[1][0]=333   fuga[1][1]=4444    

と初期値が設定される.配列よりも初期値が少ない場合には,残りのゼロに初期化される. 多い場合にはエラーとなる.

2.4 配列へのアクセス

配列では,配列名と添え字(インデックス)を指定する--たとえばi[3]j[25][49]--ことにより,記憶領域から値(データ)を入出力できる.
	i[3]=5;         /* 配列 i[3] に 5 を代入 */
	c=j[25][49];    /* 配列 j[25][49] の値を変数 c へ代入 */

配列全体をコピーする場合,要素毎に代入文を実行する必要がある.例えば,サイズ $ 100\times 200$の配列hoge[][]fuga[][]があるとする.hoge[][]のデータを fuga[][]にコピーする場合,次のようにする.

	for(i=0; i<=99; i++){
	  for(j=0; i<=199; i++){
	    fuga[i][j]=hoge[i][j];
	  }
	}

2.5 注意

配列を使う場合,以下のような間違いが多い.気を付けよ.
ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成18年12月15日


no counter