【8-1】编写一个数组的声明,把数组的某些特定位置初始化为特定的值。这个数组的名字应该叫char_value,它包含3×6×4×5个无符号字符。
下面的表中列出的这些位置应该用相应的值进行静态初始化。
那些在上表未提到的位置应该被初始化为二进制值0而不是字符’\0',注意:应该使用静态初始化,在你的解决方案中不应该存在任何可执行代码!尽管并非解决方案的一部分,你可能很想编写一个程序,通过打印数组的值来验证它的初始化,由于某些值并不是可打印的字符,所以请把这些字符用整型的形式打印出来(用八进制或十六进制输出会更方便一些)。注意,用两种方法解决这个问题,一次在初始化列表中使用嵌套的花括号,另一次则不使用,这样你就能深刻理解嵌套花括号的作用。
首先看一下这个4维数组的定义:
//3,6,4,5
{
{
{
{0000, 0001,0002,0003, 0004},
{0010, 0011,0012,0013, 0014},
{0020, 0021,0022,0023, 0024},
{0030, 0031,0032,0033, 0034}
},
{
{0100, 0101,0102,0103, 0104},
{0110, 0111,0112,0113, 0114},
{0120, 0121,0122,0123, 0124},
{0130, 0131,0132,0133, 0134}
},
{
{0200, 0201,0202,0203, 0204},
{0210, 0211,0212,0213, 0214},
{0220, 0221,0222,0223, 0224},
{0230, 0231,0232,0233, 0234}
},
{
{0300, 0301,0302,0303, 0304},
{0310, 0311,0312,0313, 0314},
{0320, 0321,0322,0323, 0324},
{0330, 0331,0332,0333, 0334}
},
{
{0400, 0401,0402,0403, 0404},
{0410, 0411,0412,0413, 0414},
{0420, 0421,0422,0423, 0424},
{0430, 0431,0432,0433, 0434}
},
{
{0500, 0501,0502,0503, 0504},
{0510, 0511,0512,0513, 0514},
{0520, 0521,0522,0523, 0524},
{0530, 0531,0532,0533, 0534}
},
},
{
{
{1000, 1001,1002,1003, 1004},
{1010, 1011,1012,1013, 1014},
{1020, 1021,1022,1023, 1024},
{1030, 1031,1032,1033, 1034}
},
{
{1100, 1101,1102,1103, 1104},
{1110, 1111,1112,1113, 1114},
{1120, 1121,1122,1123, 1124},
{1130, 1131,1132,1133, 1134}
},
{
{1200, 1201,1202,1203, 1204},
{1210, 1211,1212,1213, 1214},
{1220, 1221,1222,1223, 1224},
{1230, 1231,1232,1233, 1234}
},
{
{1300, 1301,1302,1303, 1304},
{1310, 1311,1312,1313, 1314},
{1320, 1321,1322,1323, 1324},
{1330, 1331,1332,1333, 1334}
},
{
{1400, 1401,1402,1403, 1404},
{1410, 1411,1412,1413, 1414},
{1420, 1421,1422,1423, 1424},
{1430, 1431,1432,1433, 1434}
},
{
{1500, 1501,1502,1503, 1504},
{1510, 1511,1512,1513, 1514},
{1520, 1521,1522,1523, 1524},
{1530, 1531,1532,1533, 1534}
},
},
{
{
{2000, 2001,2002,2003, 2004},
{2010, 2011,2012,2013, 2014},
{2020, 2021,2022,2023, 2024},
{2030, 2031,2032,2033, 2034}
},
{
{2100, 2101,2102,2103, 2104},
{2110, 2111,2112,2113, 2114},
{2120, 2121,2122,2123, 2124},
{2130, 2131,2132,2133, 2134}
},
{
{2200, 2201,2202,2203, 2204},
{2210, 2211,2212,2213, 2214},
{2220, 2221,2222,2223, 2224},
{2230, 2231,2232,2233, 2234}
},
{
{2300, 2301,2302,2303, 2304},
{2310, 2311,2312,2313, 2314},
{2320, 2321,2322,2323, 2324},
{2330, 2331,2332,2333, 2334}
},
{
{2400, 2401,2402,2403, 2404},
{2410, 2411,2412,2413, 2414},
{2420, 2421,2422,2423, 2424},
{2430, 2431,2432,2433, 2434}
},
{
{2500, 2501,2502,2503, 2504},
{2510, 2511,2512,2513, 2514},
{2520, 2521,2522,2523, 2524},
{2530, 2531,2532,2533, 2534}
},
}
}
根据多维数组的大括号分隔规则,整个维度没有需要初始化得全部默认设置为0,其他按位置初始化特定值:
int main () {
unsigned char char_value[3][6][4][5] = {
{//0xxx
0
},
{//1xxx
{//10xx
0
},
{//11xx
{0},//110x
{0,' '}//111x
},
{//12xx
{0},//120x
{0},//121x
{0,0,0,'A'},//122x
{0,0,0,0, 'x'}//123x
},
{//13xx
{0},//130x
{0},//131x
{0,0,0xf3}//132x
},
{//14xx
{0},//140x
{0},//141x
{0,0,0,'\n'}//142x
}
},
{//2xxx
{//20xx
0
},
{//21xx
{0},//210x
{0,0,0320},//211x
},
{//22xx
{0},//220x
{0,'0'},//221x
{0,0,'\''},//222x
{0,'\121'}//223x
},
{//23xx
0
},
{//24xx
{0},//240x
{0},//241x
{0},//242x
{0,0,'3',3}//243x
},
{//25xx
{0},//250x
{0},//251x
{0},//252x
{0,0,0,0,125}//253x
}
}
};
printf("['A' - %c]",char_value[1][2][2][3]);
printf("[%d - %d]",' ', char_value[1][1][1][1]);
printf("[0xf3 - %x]\n",char_value[1][3][2][2]);
printf("['3' - %c] ",char_value[2][4][3][2]);
printf("[%d - %d] ",'n',char_value[1][4][2][3]);
printf("[%x - %x]\n",'\121', char_value[2][2][3][1]);
printf("[3 - %d]",char_value[2][4][3][3]);
printf("[125 - %d] ",char_value[2][5][3][4]);
printf("['x' - %c]\n",char_value[1][2][3][4]);
printf("[0320 - %o] ",char_value[2][1][1][2]);
printf("[' - %c] ",char_value[2][2][2][2]);
printf("['0' - %c]\n",char_value[2][2][1][1]);
return 0;
}
输出:
['A' - A][32 - 32][0xf3 - f3]
['3' - 3] [110 - 10] [51 - 51]
[3 - 3][125 - 125] ['x' - x]
[0320 - 320] [' - '] ['0' - 0]
通过这个题目,可以很好的了解多维数组的初始化。