我在今天的c++考试中看到一个问题:
给定数组 int Multi[2][3][2] = {14,11,13,10,9,6,8,7,1,5,4,2}
, Multi[1][1][0]
的值是多少?
三维数组不应该这样初始化:{{{},{}},{{},{}},{{},{}}}
?如何找到具有这些索引的元素的值?
可以用两种方式初始化数组,但建议使用内花括号,因为这样可以提高可读性。
查找未使用大括号格式化的多维数组的元素值的最简单方法是拆分数组。例如,数组的尺寸是2x3x2:
首先将数组分割为2 sets (2x3x2)
{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个集合(2x3x2)
{{14,11,13,10,9,6},{8,7,1,5,4,2}} --> {{{14,11}, {13,10} ,{9,6}}, {{8,7}, {1,5}, {4,2}}}
现在,正如你所看到的,在每个较小的集合(2x3x2)中都有2个元素,所以你已经用大括号格式化了你的数组。现在查找索引为[1][1][0]
的元素的值比较简单。这个元素是第二([ 1 ][1][0])大组的第二([1][ 1 ][0])小集的1号([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}
}
};
唯一的理由为什么第一种形式是允许的,因为它允许你写的东西,如
int Multi[2][3][2] = {0};
显式地将第一个元素初始化为0,其余元素初始化为静态存储时间(也为0)。这意味着所有元素都将被设置为0。
写像int Multi[2][3][2] = {14,11,13,10,9,6,8,7,1,5,4,2}
这样的东西是在滥用C语言。这是非常糟糕的做法。这样做是被MISRA-C等所禁止的。
一个好的老师应该关心教你如何启用所有的编译器警告,以及如何正确地初始化多维数组,而不是让你解释混乱的无意义代码。
int多[2][3][2]={13日,14日,11日,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多[2][3][2]={{{14日11},{13日10},{9 6}},{{8、7},{1,5},{4,2}}};