配列の基本的な使い方2(任意個数を管理する)

   記憶した後で、使うことができる!

使い方の1として次のプログラミングを紹介しました。

これらに共通することは、添え字に意味を付けて、データの個数が分かっている場合です。

さて、配列の使い方の2として添え字にあまり意味がなく、 データの集合を管理するために使う配列の取り扱いです。 場合によって配列内の順番に意味を持たせることもありますが、 基本的にデータの集まりを不特定個数管理する考え方です。 標準入力バッファなどが この考えで作られています。
さてC言語の配列は、実行後に配列サイズを変更できません。 よって、そのアプリケーションで使うであろう十分な要素数の配列にして、 先頭要素から順番に詰めて記憶する取り扱いをします。
そして、配列に何個まで記憶されているかを記憶する変数と一緒に使います。 一般にこの変数名には、count、length、size、などの単語を使います。 0の添え字から使う場合、 この変数は、次に配列へ追加記憶する時の要素を指し示す添え字を記憶していることになります。

  そして入力などの順番で配列に記憶した後で、入力順に並べて表示したり、合計などのさまざまな計算に使用したり、最大値や特定データを探したり(検索)したり、並び替えたりします。 また、記憶の必要に応じて配列が管理する集合への追加や、要らなくなったデータの削除も可能です。

以下に簡単な入力例を示します。(1件分だけデータを入力する add_data関数の動作で、 既に5個まで入力済みの状態です。)

#define ISIZE 16   /* Int型配列の最大記憶可能なサイズ */
int iarray[ISIZE];  /* 配列(array)で、先頭から詰めて記憶する使い方 */
int icount = 0;     /* 上記配列の使用数                */
   ... 部分的に省略 ...
void add_data()
{
	if(icount >= ISIZE){	/* 配列が満杯か? */
	    printf("もう満杯で追加できません\n");
	    return;
	}
	printf("データをキー入力ください>"); 
	fscanf( stdin, "%d", iarray + icount); /* iarrayの先頭からicountだけ進んだ位置に入力 【 &iarray[icount]でもよい】 */
	icount++;
}

   ... 以下省略 ...
array[0]array[1]array[2]array[3]array[4]array[5]array[6]array[7]array[8]array[9]array[10]array[11]array[12]array[13]array[14]array[15]
7060759040???????????

                        (step:1) 
5個の要素が入力済みの状態で、このadd_dataが呼ばれた場合の説明です。

配列を考える場合は、次のように記憶構造をイメージすることが大事です。
(アクセスしている要素をこの色で示す)

配列で管理している全てのデータを処理(表示や計算など)する場合は
array[0] から array[icount-1] の範囲の要素をアクセスすればよいことになります。 よって、要素の追加や削除以外の処理(表示、計算など)でicountを変更しないよう注意しなければいけません。 この情報を失うと、再び array[0] から array[icount-1] の範囲でアクセスすることがでなくなります