ポインタ変数の使い方(ポインタ変数を使えない場合と比較して考えましょう)

ポインタ変数で、管理する配列を変更する。

プログラム仕様
2つの配列(それぞれは4日間で食べたパンとおにぎりの食べた個数)があり、 オペレータにその食品を選択させます。 そして選択した方の配列内のにある個数を合計し、表示するプログラムを示します。
このようなプログラムの作り方はいろいろ あるでしょうが、 次のように『ポインタ変数に、操作対象となる配列を設定する』考え方がよいでしょう。 この手法で作れば、短いコードで対応できます。以下にプログラム例を示します。

#include <stdio.h>

main()
{
	int pan[4] = { 3, 1, 0, 2};	/* パン */
	int oni[4] = { 1, 2, 3, 2};	/* おにぎり */
	int op;		/* オペレータの操作入力用 */
	int * p;		/* 処理対象を記憶するポインタ */
	int sum = 0;	/* 合計用 */
	int i;

	printf("パンなら 1、おにぎりなら 2 を入力>");
	fscanf(stdin, "%d", &op);
	if(op == 1) {
		p = pan; /* パンの配列をpに管理させる */
	} else {
		p = oni; /* おにぎり配列をpに管理させる */
	}
	
	for(i = 0; i < 4; i++){
		sum += p[i];
	}
	printf("合計は%d個です。\n", sum);
}

p =で、選択した配列の要素先頭アドレスを記憶させて、それを使っています。
配列は、各要素をメモリへ順番に割り当てたものなので、先頭要素のアドレスを記憶することは、 そこを基準に、配列全体をアクセスできることを意味します。
つまり、ポインタ変数を使うことで操作対象となる集合を容易に変更できます。

実行例1実行例2
パンなら 1、おにぎりなら 2 を入力>1          
合計は6個です。
パンなら 1、おにぎりなら 2 を入力>2          
合計は8個です。

関数の仮引数にポインタ変数を使う。

仮引数をポインタ変数にすれば、配列などのポインタを実引数とした関数の実行ができます。
この場合の、関数側におけるポインタを介した記憶域のアクセスは、呼び出し側のローカル な配列でも可能になります。

以下のこのcalc_sum関数のプログラム例を示します。

#include <stdio.h>

int calc_sum(int * p , int cnt)
{
	int sum = 0;	/* 合計用 */
	int i;
	for(i = 0; i < cnt; i++){
		sum += p[i];
	}
	return sum;	
}

main()
{
	int pan[4] = { 3, 1, 0, 2};	/* パン */
	int oni[4] = { 1, 2, 3, 2};	/* おにぎり */
	int op;		/* オペレータの操作入力用 */
	int sum;

	printf("パンなら 1、ご飯なら 2 を入力>");
	fscanf(stdin, "%d", &op);
	if(op == 1) {
		sum =  calc_sum( pan, 4); /* パン配列の個数総和計算 */
	} else {
		sum =  calc_sum( oni, 4); /* おにぎり配列の個数総和計算 */
	}
	
	printf("合計は%d個です。\n", sum);
}