多次元配列
多次元配列の要素とアドレスがどうなるのか確かめてみる
#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; }