配列使い方2:参考ページ 、ポインタ操作:参考ページ

配列の使い方2の特別版
(個数を記憶する変数を使わない任意個数管理)

C言語の配列は、実行後に配列サイズを変更できません。
よって、そのアプリケーションで使うデータ数が決まっていない場合、 使うであろう十分な要素数の配列にして、 先頭要素から順番に詰めて記憶する取り扱いをしました。
この時、『配列に何個まで記憶されているかを記憶する変数』と 一緒に使ってきましたが、 このような変数を使わなくても、管理できる場合があります。

それは、配列の各要素を順番に処理するだけのようなデータの場合です。
このような場合は、配列においてデータの並びが終わった区切りが分かればいいので、 データとして使わないような値を、終端値と決めて、要素に埋め込んで使います。

C言語において、このような管理をする代表的なデータが文字列です。
C言語では文字列を記憶する型がなく、文字コードが並ぶ先頭の文字を指すポインタで管理します。 そして、その並びの終端値'\0' のコードと決めて使っています。

具体例

例えば試験点数のデータが数件あるとして、それを配列で管理させる例で示します。
この場合、負の点数がないので例えば-99を 情報の区切りまたは終端と決めて使います。
以下は、数字以外や負のキー入力データまで、配列へのデータ追加を繰り返す関数 input_u を実行した後、 入力したデータを列挙しているプログラムです。

#include <stdio.h>
#define MAXNUMB 100

void input_u( int * a )
{
	int i;
	for(i = 0; ; i++){
		printf("点数入力>");
		if( fscanf( stdin , "%d",  a + i ) != 1) break;
		if( a[i] < 0 ) break;
	}
	a[i] = -99;
	fflush(stdin);
}
main()
{
	int array[MAXNUMB];
	int i;

	input_u( array );
	for(i = 0; array[i] != -99; i++){
		printf("%d\n", array[i] );
	}
}
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]
????????????????

                        (step1)
array配列の情報一つを引数にしてinput_u関数を呼び出します。