这些三维数组在C中合法吗?

Sat*_*elt 7 c arrays

我教授的期末考试主要包括非常棘手的语法.例如,他的一些问题就像是"使用指针1来打印字母k而不使用括号.幸运的是它是打开的书.

所以有一个问题是:

int a[2][2][2] = {{5,6}, {7,8}, {9,10}, {11,12}}; 
Run Code Online (Sandbox Code Playgroud)

写一个打印出"7910"的printf语句.使用指针而不使用方括号.

起初,我认为这是一个错字或非法阵列.我以为数组应该从左边的第三个数组停止.

我写:

printf("%d%d%d\n",*(*(a+1)+1)),*(*(a+2)),*(*(a+2)));
Run Code Online (Sandbox Code Playgroud)

我把它放了,因为如果阵列是

int a[2][2] = {{7,8},{11,12}};
Run Code Online (Sandbox Code Playgroud)

类似的语法可行.

这是一个错字吗?如果没有,那么正确的语法是什么?

hac*_*cks 5

在大多数情况下,编译器会将上面的初始化解析为

int a[2][2][2] = { { {5,6}, {7,8} }, 
                   { {9,10}, {11,12} }
                 };   
Run Code Online (Sandbox Code Playgroud)

如果您将其写为,这也将起作用

int a[2][2][2] = {5, 6, 7, 8, 9, 10, 11, 12};   
Run Code Online (Sandbox Code Playgroud)

但这真的不是一个好习惯.

C标准说
§6.7.9(p17):

当没有指定时,根据当前对象的类型按顺序初始化当前对象的子对象:增加下标顺序的数组元素,声明顺序中的结构成员,以及联合的第一个命名成员149).[...]

P26

例3声明

int y[4][3] = {
    { 1, 3, 5 },
    { 2, 4, 6 },
    { 3, 5, 7 },
};
Run Code Online (Sandbox Code Playgroud)

是具有充分括号初始化一个定义:1,3,和5初始化的第一行y(数组对象y[0]),即y[0][0],y[0][1]y[0][2].同样,接下来的两行初始化y[1]y[2].初始化器提前结束,因此y[3]用零初始化.准确地说,可以达到同样的效果

int y[4][3] = {
    1, 3, 5, 2, 4, 6, 3, 5, 7
};
Run Code Online (Sandbox Code Playgroud)

初始化程序y[0]不以左括号开头,因此使用列表中的三个项目.同样,接下来的三个是连续采取y[1]y[2].