入力3(ポインタを返す)   

以前(e34042m1.htm)に紹介した「配列へキー入力する関数」の別解です。

以前に紹介したinput_i 関数の定義と実行例を示します

#include <stdio.h>

/* 数字でないデータ入力まで、pが指し示す配列へ入力する。
入力したデータ個数が戻り値(imaxは、p配列が扱える最大個数)*/
int input_i(int *p , int imax)
{
	int icount = 0;
	while( icount < imax ) {
		printf("%d:DATA>", icount);
		if( fscanf(stdin, "%d", p + icount) != 1) break;
		icount++;
	}
	fflush(stdin);
	return icount;
}
main()
{
	int array1[10];
	int count1 = 0;
	int i;

	count1 = input_i(array1, 10);

	for(i = 0; i < count1; i++){
		printf("%d:%d\n", i, array1[i]);
	}
}
0:DATA>5
1:DATA>2
2:DATA>6
3:DATA>5
4:DATA>end
0:5
1:2
2:6
3:5

上記のinput_i 関数では、関数から得られる情報(入力したデータ個数)を戻り値にしています。
同じ動作結果を得る別のプログラムを、以下に示します。(C言語特有の関数の作り方です)
それは、戻り値を添え字でなく、最後に記憶した記憶域の次のアドレスを返す関数に変更した形態です。
この形態の関数の呼び出し側では、ポインタint型のicountでなく、 ポインタで「記憶要素の最後」を管理することになります。
以下は、このポインタ用の変数をendpの名前で用意して、利用している例です。
 なお、このようなポインタで管理する場合は、添え字 i を使わないで、ポインタのままで利用するケースがあります。 そのように使うもう一つのmain例を、最下位に示して説明します。

#include <stdio.h>
int * input_i(int *p , int imax)
{
	int icount = 0;
	while( icount < imax ) {
		printf("%d:DATA>", icount);
		if( fscanf(stdin, "%d", p + icount) != 1) break;
		icount++;
	}
	fflush(stdin);
	return p + icount;
}
main()
{
	int array1[10];
	int *endp;
	int i;

	endp = input_i(array1, 10);

	for(i = 0; array1 + i < endp; i++){
		printf("%d:%d\n", i, array1[i]);
	}
}

進む順番で説明します。⇒ (step1)

x
x
main()
{
	int array1[10];
	int *endp;
	int *p;

	endp = input_i(array1, 10);

	for(p = array1; p < endp;  p++){
		printf("%d:%d\n", p-array1, *p );
	}
}

上記は、ポインタ変数を変更して繰り返すC言語独特のプログラムです