マトリョーシカ的日常

ワクワクばらまく明日のブログ。

ぼろアパートでわかる!二次元配列(C言語)

二次元配列ってわかりづらい

 いや、二次元配列がわかりにくいわけではない。matlabに比べてCは配列に関するコードが長ったらしいのだ。任意の行の内容を出力するのにいちいち行と列成分を指定し、for文で回さないといけなかったり、行列のサイズを取得するのにも割り算を使う必要があったり…。

 そして調べてみてもポインタだの宣言だのint型long型だの訳の分からない単語を使い、初心者を煙に巻くのだ。

 それでも配列に関して、わずかながら理解することが出来たのでここにまとめてみようと思う。

一次元配列は一戸建てで、二次元配列はアパート。

 

 配列とは似たような要素を収納する箱のようなもので、箱それぞれに番号を与え、後から要素を取り出すときに分かりやすくする働きがある。上の図の場合は配列は箱ではなく家で、要素は家に住んでいる人の年齢だと考えてほしい。一次元配列は一戸建て、二次元配列はアパートと考えると分かりやすい。
 注意してほしいのは、番号が0から始まるということだ。以下のプログラムでは番地を指定する変数f(整数)を0から3未満、つまり0から2まで一つずつ増やし、一戸建てに住んでいる人の年齢を出力させている。

#include 
int main()
{
        int f=0;
	int house[3]={18,22,31};//18歳、22歳、31歳
        for(f=0;f<3;f++){
            //house[f]の各要素の内容を4マス文使って表示
            printf("%4d",house[f]);
        }
   return 0;
}

実行後

  18  22  31
logout

[プロセスが完了しました]

 次に二次元配列の場合のプログラムを載せる。

#include 
int main()
{
    int i=0,f=0;
	int pack[2][3]={{18,21,31},{20,47,50}};
	//出力表示:行数i |pack[i][0] pack[i][1]…
	for(i=0;i<2;i++){
          for(f=0;f<3;f++){
            //d[i][f]の各要素の内容を4マス文使って表示
            printf("%4d",pack[i][f]);
           }
        //改行のみ
        printf("\n");
    }	
    return 0;
}

実行後

 18  21  31
  20  47  50
logout

[プロセスが完了しました]

配列のサイズを取得する

 さて、配列の要素を出力するにはfor文を用いるが、これには何回繰り返すかを入力する必要がある。上のプログラムでは2回や3回といった定数で入力していた。しかしこれでは配列のサイズ(アパートの大きさ)が変わったときにいちいち書き換えなくてはならず、やや面倒である。
 というわけで今度は繰り返す回数を「配列のサイズ」という変数で決めるプログラムをつくる。配列のサイズを取得するにはsizeof演算子をつかう。また、for文の中の2,3をそれぞれrowとcolに書き換える。

#include 
int main()
{
    int i=0,f=0;
	int pack[9][10]={{18,21,31},{20,47,50}};

        const int row=sizeof pack/ sizeof pack[0];
	const int col=sizeof pack[0]/sizeof pack[0][0];
	const int a= sizeof pack;
	const int b= sizeof pack[0];
	const int c= sizeof pack[0][0];
	
	printf("sizeof pack:%d\n",a);
	printf("sizeof pack[0]:%d\n",b);
	printf("sizeof pack[0][0]:%d\n",c);
	printf("行数 (sizeof pack/ sizeof pack[0]): =%d\n",row);
	printf("列数 (sizeof pack[0]/sizeof pack[0][0]):=%d \n",col);
	printf("\n");

	//出力表示:行数i |pack[i][0] pack[i][1]…
	for(i=0;i

実行後

sizeof pack:360
sizeof pack[0]:40
sizeof pack[0][0]:4
行数 (sizeof pack/ sizeof pack[0]): =9
列数 (sizeof pack[0]/sizeof pack[0][0]):=10 


  18  21  31   0   0   0   0   0   0   0
  20  47  50   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0
logout

[プロセスが完了しました]

「sizeof pack」は直接配列のサイズを返すわけではない。ここでは360というよくわからない数字になっている。二次元配列では行数を出力するにはsizeof packを sizeof pack[0]で除する必要がある。上の図をみると分かるが、sizeof pack[0]は一行分のサイズである。つまり360/40=9となる。列数はsizeof pack[0]/sizeof pack[0][0]。sizeof pack[0][0]は要素一つ分のサイズ。

 分かりにくい場合は要素一つ分のサイズを部屋の広さに置き換えるといいかもしれない。一部屋四畳のおんぼろアパートだ。9×10=90部屋あるこのアパートの広さの総和は90×4=360畳。一行分のサイズは同じ階にある部屋の広さの総和40畳…。


 どうなんだろ。こんなんでわかるのかな。難しいなぁ。解説は。