第8講 ポインタと配列の学習
第6話 多次元配列と1次元配列の関係の解説

前話問題再掲
char a[8][4][5];
char b[160];
char *c;
前話問題解答例
a[i][j][k]=b[20*i+5*j+k]
c=(char *)malloc;
a[i][j][k]=*(c+20*i+5*j+k)

なぜこの解答でよいのでしょうか。
問題を2次元に戻して考えてみましょう。
char a[4][5];
char b[20];
for(i=0;i<4;i++){
  for(j=0;j<5;j++){
    a[i][j]=b[5*i+j];
  }
}
a[4][5]の場合,添え字は次のようになっています。
00 01 02 03 04
10 11 12 13 14
20 21 22 23 24
30 31 32 33 34
それに対して、b[20]の場合は、
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
ですが、
00 01 02 03 04
10 11 12 13 14
20 21 22 23 24
30 31 32 33 34

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19の同色が対応していればよいわけです。
iとjをトレースして動きを追ってみましょう。

i j 5*i+j
0 0 0
0 1 1
0 2 2
0 3 3
0 4 4
1 0 5
1 1 6
1 2 7
1 3 8
1 4 9
2 0 10
2 1 11
2 2 12
2 3 13
2 4 14
3 0 15
3 1 16
3 2 17
3 3 18
3 4 19

皆さんは、iとjに実際に値を代入して上の表の通りになることを確認しましょう。
今度は、
char a[2][3][4];
char b[24];
for(i=0;i<2;i++){
  for(j=0;j<3;j++){
    for(k=0;k<4;k++){
      a[i][j][k]=b[12*i+4*j+k];
    }
  }
}
の場合でトレースしてみましょう。

i=0のとき         i=1のとき
000 001 002 003   100 101 102 103  
010 011 012 013   110 111 112 113
020 021 022 023   120 121 122 133

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

i j k 12*i+4*j+k
0 0 0 0
0 0 1 1
0 0 2 2
0 0 3 3
0 1 0 4
0 1 1 5
0 1 2 6
0 1 3 7
0 2 0 8
0 2 1 9
0 2 2 10
0 2 3 11
1 0 0 12
1 0 1 13
1 0 2 14
1 0 3 15
1 1 0 16
1 1 1 17
1 1 2 18
1 1 3 19
1 2 0 20
1 2 1 21
1 2 2 22
1 2 3 23

確かに、対応していることがわかります。


第5話へ 第9講第1話へ



初心者のためのjava 入門 基礎から応用まで
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第1部
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第2部
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第3部
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすい vb 入門 vba 入門 基礎から応用まで 第1部
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ