multidimensional array初始化

我今天在C ++考试中看到了一个问题:

给定数组 int Multi[2][3][2] = {14,11,13,10,9,6,8,7,1,5,4,2}Multi[1][1][0] 的值是多less? Multi[1][1][0]

不应该像这样初始化三维数组: {{{},{}},{{},{}},{{},{}}} ? 我怎样才能find这样的元素的价值? 这很混乱

你可以用两种方式初始化数组。 使用curl的内括号是可选的,但build议,因为他们提高了可读性。

使用大括号multidimensional array来查找非格式化元素的值的最简单的方法是分割数组。 例如,你的数组的尺寸是2x3x2:

首先将数组分成2组( 2 x3x2)

 {14,11,13,10,9,6,8,7,1,5,4,2} --> {{14,11,13,10,9,6}, {8,7,1,5,4,2}} 

然后将每个部分分成3组(2×3 x2)

 {{14,11,13,10,9,6},{8,7,1,5,4,2}} --> {{{14,11}, {13,10} ,{9,6}}, {{8,7}, {1,5}, {4,2}}} 

现在,正如你所看到的,每个较小的集合(2x3x 2 )还剩下两个元素,所以你用花括号把你的数组格式化了。

现在find索引为[1][1][0]的元素的值更为简单。 这个元素是第二个([ 1 ] [1] [0])较大的集合的第二个([1] [ 1 ] [0])较小集合的第一个([1] [1] [ 0 ])元素,所以答案是1

应该得到满分的正确答案是:编译代码时启用了所有的警告,并且最终不会像这样编写糟糕的代码。

 gcc test.c -std=c11 -pedantic-errors -Wall -Wextra test.c: In function 'main': test.c:6:3: warning: missing braces around initializer [-Wmissing-braces] int Multi[2][3][2] = {14,11,13,10,9,6,8,7,1,5,4,2}; ^ 

不过,我怀疑你的老师并不太在意代码是垃圾,而是在寻找C语言中的细节,它允许数组(和结构)被初始化,即使括号列表不匹配什么是初始化。

就C语言而言, int Multi[2][3][2] = {14,11,13,10,9,6,8,7,1,5,4,2}完全等价于:

 // properly written initialization list for a 3D array int Multi[2][3][2] = { { {14, 11}, {13, 10}, { 9, 6} }, { { 8, 7}, { 1, 5}, { 4, 2} } }; 

为什么第一种forms被允许的唯一原因是因为它允许你写这样的东西

 int Multi[2][3][2] = {0}; 

它明确地将第一个元素初始化为0,其余的元素就好像它们具有静态存储持续时间(0)一样。 意味着所有元素将被设置为零。

int Multi[2][3][2] = {14,11,13,10,9,6,8,7,1,5,4,2}就是在滥用C语言。 这是非常糟糕的做法。 这样做是被MISRA-C等禁止的。

一个好老师会关心如何启用所有的编译器警告,以及如何正确初始化multidimensional array,而不是让你解释混淆的无意义代码。

int Multi [2] [3] [2] = {14,11,13,10,9,6,8,7,1,5,4,2};

Multi [2] [3] [2]的存储器映射是 – >

多[0] [0] [0] = 14;

多[0] [0] [1] = 11;

多[0] [1] [0] = 13;

多[0] [1] [1] = 10;

多[0] [2] [0] = 9;

多[0] [2] [1] = 6;

多[1] [0] [0] = 8;

多[1] [0] [1] = 7;

多[1] [1] [0] = 1;

多[1] [1] [1] = 5;

多[1] [2] [0] = 42;

多[1] [2] [1] = 2;

因此Multi [1] [1] [0] = 1的值; 这很简单

我们也可以像这样初始化

int Multi [2] [3] [2] = {{{14,11},{13,10},{9,6}},{{8,7},{1,5},{4,2 }}};