出自《C和指針》第8章練習題:初始化一個unsigned char char_value[3][6][4][5]四維數組,在特定位置賦予特定值,其餘為0。這展示了C語言指定初始化器(C99)與嵌套大括號的強大組合。
static unsigned char char_value[3][6][4][5] = {
{ // [0]
{ // [0][0]
{ 0 } // [0][0][0]
}
},
{ // [1]
{ // [1][0]
{ 0 } // [1][0][0]
},
{ // [1][1]
{ 0 }, // [1][1][0]
{ 0, ' ' } // [1][1][1]
},
{ // [1][2]
{ 0 }, // [1][2][0]
{ 0 }, // [1][2][1]
{ 0, 0, 0, 'A' },// [1][2][2]
{ 0, 0, 0, 0, 'x'}// [1][2][3]
},
{ // [1][3]
{ 0 }, // [1][3][0]
{ 0 }, // [1][3][1]
{ 0, 0, 0xf3 } // [1][3][2]
},
{ // [1][4]
{ 0 }, // [1][4][0]
{ 0 }, // [1][4][1]
{ 0, 0, 0, '\n' } // [1][4][2]
},
{ // [1][5]
{ 0 } // [1][5][0]
}
},
{ // [2]
{ // [2][0]
{ 0 } // [2][0][0]
},
{ // [2][1]
{ 0 }, // [2][1][0]
{ 0, 0, 0320 } // [2][1][1] 八進制320 = 208
},
{ // [2][2]
{ 0 }, // [2][2][0]
{ 0, '0' }, // [2][2][1]
{ 0, 0, '\'' }, // [2][2][2]
{ 0, '\121' } // [2][2][3] 八進制121 = 'Q'
},
{ // [2][3]
{ 0 } // [2][3][0]
},
{ // [2][4]
{ 0 }, // [2][4][0]
{ 0 }, // [2][4][1]
{ 0 }, // [2][4][2]
{ 0, 0, '3', 3 } // [2][4][3]
},
{ // [2][5]
{ 0 }, // [2][5][0]
{ 0 }, // [2][5][1]
{ 0 }, // [2][5][2]
{ 0, 0, 0, 0, 125 } // [2][5][3]
}
}
};
每層{ }對應一個維度:
char_value[3][6][4][5] → 4層大括號嵌套
外層3個元素 → 中層6個 → 內層4個 → 最內層5個
{0, ' '}初始化前2個,後3個補0現代寫法可用[索引] = 值直接定位,避免層層嵌套:
static unsigned char char_value[3][6][4][5] = {
[1][1][1][1] = ' ',
[1][2][2][3] = 'A',
[1][2][3][4] = 'x',
[1][3][2][2] = 0xf3,
[1][4][2][3] = '\n',
[2][1][1][2] = 0320,
[2][2][1][1] = '0',
[2][2][2][2] = '\'',
[2][2][3][1] = '\121',
[2][4][3][2] = '3',
[2][4][3][3] = 3,
[2][5][3][4] = 125,
};
這種寫法可讀性極強、易維護、不易出錯,強烈推薦用於稀疏多維數組初始化。
數組按行優先序連續存儲:
char_value[0][0][0][0] → char_value[0][0][0][1] → ... → char_value[2][5][3][4]
總大小:3×6×4×5 = 360字節
()與{}:(0,1,2)是逗號表達式,值為2;{0,1,2}才是初始化列表[3][6][4][5]訪問[3]越界0320是八進制(208),非十進制320{},每行一級縮進,註釋索引static)避免棧溢出-Wmissing-braces捕獲大括號缺失掌握多維數組初始化技巧,能讓複雜數據結構的靜態構建變得清晰、可維護。