この辺のことをリスト7でみる.関数transposeで行列を転置 4している.main関数のtranspose(a)で, 関数transposeに配列a[5][5]の先頭アドレスを渡している.配列のところで学 習したように,配列名は,その配列の先頭アドレスを表す.
先頭アドレスは,transpose関数では,
transpose(int x[][5])の形で受け取る.アドレスが渡されたので,ポインターで受け取ることも出来るが,そう すると,後々の操作が大変になるので通常は避ける.配列を受け取る場合は,配列として 受け取る方が断然良い.
ここで,受け取る配列の大きさが,x[][5]とすべて記述されていない.配列のとこ ろで,学習したように,サイズは,指定の配列をアクセスするためのアドレスのオフセッ ト計算に用いる.したがって,オフセット計算に不用な一番左のサイズは書かなくても良 い.もちろん書いても良く,twx[5][5]でも問題はないが,間違える確率が増えるので 通常は書かない..
一方,配列定義のときは,コンパイラーはメモリーを確保するために,配列全体サイズが 必要である.したがって,x[5][5]のようにすべて記述しなくてはならない.このよ うな理由から,もっと多次元の配列,例えば,x[100][100][5][5]のような配列を hogehoge関数側で受け取る場合,hogehoge(int x[][100][5][5])と書く.左端のみ 省略可である.
1 #include <stdio.h> 2 3 void transpose(int x[][5]); /* プロトタイプ宣言 */ 4 5 /*=====================================================================*/ 6 /* メイン関数 */ 7 /*=====================================================================*/ 8 int main(void){ 9 int i; 10 int a[5][5] 11 ={{11, 12, 13, 14, 15}, 12 {21, 22, 23, 24, 25}, 13 {31, 32, 33, 34, 35}, 14 {41, 42, 43, 44, 45}, 15 {51, 52, 53, 54, 55}}; 16 17 for(i=0; i<=4; i++){ 18 printf("%d %d %d %d %d \n", 19 a[i][0], a[i][1], a[i][2], a[i][3], a[i][4]); 20 } 21 22 transpose(a); 23 printf("\n"); 24 25 for(i=0; i<=4; i++){ 26 printf("%d %d %d %d %d \n", 27 a[i][0], a[i][1], a[i][2], a[i][3], a[i][4]); 28 } 29 30 return 0; 31 32 } 33 34 35 /*=====================================================================*/ 36 /* 転置行列を計算する関数 */ 37 /*=====================================================================*/ 38 void transpose(int x[][5]) 39 { 40 int i, j, temp; 41 42 for(i=0; i<=3; i++){ 43 for(j=i+1; j<=4; j++){ 44 temp = x[i][j]; 45 x[i][j] = x[j][i]; 46 x[j][i] = temp; 47 } 48 } 49 }
11 12 13 14 15 21 22 23 24 25 31 32 33 34 35 41 42 43 44 45 51 52 53 54 55 11 21 31 41 51 12 22 32 42 52 13 23 33 43 53 14 24 34 44 54 15 25 35 45 55