多次元配列のちょっと変わった参照の仕方

いきなりですが、配列の値を参照するための a[1] というのは、 *(a + 1) を少しでも気楽に書けるようにするための構文らしいです(こういうのをシンタックスシュガーと呼ぶらしい)。
でもって、*(a + 1) と *(1 + a) の値は同じになりますね?ここで、*(1 + a) を[]使った形に直すと 1[a] になります。実は a[1] と 1[a] は同じ意味になってしまうのだ!


とまあ、ここまでは

C言語ポインタ完全制覇 (標準プログラマーズライブラリ)

C言語ポインタ完全制覇 (標準プログラマーズライブラリ)

を読んだりして知っていたんですが、多次元になるとどうなるのかとふと思い立ちやってみました。
といっても、構文規則は同じなので恐れることはない。

#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]) になるみたい。ここは実行してみてから気づいた。