この辺のことをリスト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