第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 |
確かに、対応していることがわかります。
初心者のためのjava 入門 基礎から応用まで
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第1部
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第2部
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第3部
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすい vb 入門 vba 入門 基礎から応用まで 第1部
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ