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 }}};