多次元配列

多次元配列の要素とアドレスがどうなるのか確かめてみる

#include <stdio.h>

int main()
{
	int a[3][2] = {10,20,30,40,50,60};
	int i,j;

	for(i=0;i<3;i++){
		for(j=0;j<2;j++){
			printf("a[%d][%d] = %d\n",i,j,a[i][j]);
		}
	}
	printf("\n");
	/*各要素のアドレスを確かめる*/
	for(i=0;i<3;i++){
		for(j=0;j<2;j++){
			printf("&a[%d][%d] = %p (a[%d]+%d) = %p\n",
				i,j,&a[i][j],i,j,(a[i]+j));
		}
	}
	printf("\n" );
	
	/* a[m][n] を *(*(a+m)+n)と書けるのか確かめる */

	for(i=0;i<3;i++){
		for(j=0;j<2;j++){
			printf("*(*(a+%d)+%d) = %d\n",
				i,j,*(*(a+i)+j));
		}
	}
	return 0;
}

実行結果

a[0][0] = 10
a[0][1] = 20
a[0][2] = 30
a[1][0] = 30
a[1][1] = 40
a[1][2] = 50
a[2][0] = 50
a[2][1] = 60

&a[0][0] = 0013F8F8 (a[0]+0) = 0013F8F8
&a[0][1] = 0013F8FC (a[0]+1) = 0013F8FC
&a[1][0] = 0013F900 (a[1]+0) = 0013F900
&a[1][1] = 0013F904 (a[1]+1) = 0013F904
&a[2][0] = 0013F908 (a[2]+0) = 0013F908
&a[2][1] = 0013F90C (a[2]+1) = 0013F90C

*(*(a+0)+0) = 10
*(*(a+0)+1) = 20
*(*(a+1)+0) = 30
*(*(a+1)+1) = 40
*(*(a+2)+0) = 50
*(*(a+2)+1) = 60

一次元配列とさほど変わらないことが分かった。

ちょっと実用的な例

テストの平均点と、個人別総合得点を求めるプログラム。

define NO 3

int main()
{
	int point[][2] = {
		80,80,
		100,98,
		60,80,
	};

	int i,j,sum = 0,p_sum[NO];
	double ave;

	for(i=0;i<NO;i++){
		sum += point[i][0];
	}
	ave = (double)sum/NO;

	printf("英語の平均点は%5.2fです。\n",ave);
	
	sum=0;
	for(i=0;i<NO;i++){
		sum += point[i][1];
	}
	ave = (double)sum/NO;
	

	printf("数学の平均点は%5.1fです。\n",ave);

	for(i=0;i<NO;i++){
		p_sum[i] = 0;
	}

	for(i=0;i<NO;i++){
		for(j=0;j<2;j++){
			p_sum[i] += point[i][j];
		}
		printf("出席番号%dの総得点%d\n",i+1,p_sum[i]);
	}
	return 0;
}