多次元配列のちょっと変わった参照の仕方
いきなりですが、配列の値を参照するための a[1] というのは、 *(a + 1) を少しでも気楽に書けるようにするための構文らしいです(こういうのをシンタックスシュガーと呼ぶらしい)。
でもって、*(a + 1) と *(1 + a) の値は同じになりますね?ここで、*(1 + a) を[]使った形に直すと 1[a] になります。実は a[1] と 1[a] は同じ意味になってしまうのだ!
とまあ、ここまでは
- 作者: 前橋和弥
- 出版社/メーカー: 技術評論社
- 発売日: 2001/01
- メディア: 単行本
- 購入: 22人 クリック: 147回
- この商品を含むブログ (75件) を見る
といっても、構文規則は同じなので恐れることはない。
#include <stdio.h> int main() { int a[2][3][4] = { { { 0, 1, 2, 3, }, { 4, 5, 6, 7, }, { 8, 9, 10, 11, }, }, { { 12, 13, 14, 15, }, { 16, 17, 18, 19, }, { 20, 21, 22, 23, }, }, }; printf("%d\n", a[1][2][3]); printf("%d\n", (*(a + 1))[2][3]); printf("%d\n", (*(*(a + 1) + 2))[3]); printf("%d\n", *(*(*(a + 1) + 2) + 3)); printf("%d\n", *(*(1[a] + 2) + 3)); printf("%d\n", *(2[1[a]] + 3)); printf("%d\n", 3[2[1[a]]]); return 0; }
どの printf でも 23 が出力されます。だからなんだっていうんだって話ですがね。
そういえば、*(a + 1)[2][3]だと *((a + 1)[2][3]) になるみたい。ここは実行してみてから気づいた。