6 配列の受け渡し

配列の受け渡しは,変数の場合と異なる.1変数の場合,実引数のコピーが仮引数に渡さ れることは,以前に述べた通りである(値渡し).しかし,驚いたことに,配列の場合,実 引数のアドレスが,仮引数に渡される.FORTRANと同じである.なぜ,このような不統一 が生じるかというと, ということが理由のようである.仕様でそのようになっているので仕方ないが,不統一の 感はぬぐない.この辺が,C言語は難しいと思う人が出てくる原因になっている可能性が ある.

この辺のことをリスト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 }
\fbox{結果}
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



ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成18年5月23日


no counter