多维数组初始化

46 c c++ multidimensional-array

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

给定数组 int Multi[2][3][2] = {14,11,13,10,9,6,8,7,1,5,4,2},有什么价值 Multi[1][1][0]

不应为3维数组初始化是这样的:{{{},{}},{{},{}},{{},{}}}?如何找到具有此类indeces的元素的值?这太令人困惑了.

gdr*_*drt 63

您可以通过两种方式初始化数组,但建议使用卷曲内括号,因为它可以提高可读性.

找到未使用大括号格式化的多维数组元素值的最简单方法是拆分数组.例如,您的数组的尺寸为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}}
Run Code Online (Sandbox Code Playgroud)

然后将每组分成3组(2x 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}}}
Run Code Online (Sandbox Code Playgroud)

现在,正如您所看到的,每个较小的集合中都有2个元素(2x3x 2),因此您已使用大括号格式化数组.

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


话虽这么说,这样的考试问题表明你的老师缺乏专业性,他对滥用编程语言语法更感兴趣,而不是教授基本的初始化规则.


Lun*_*din 24

应该产生满分的正确答案是:编译代码并启用所有警告,你最终不会像这样编写蹩脚的代码.

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};
   ^
Run Code Online (Sandbox Code Playgroud)

但是,我怀疑你的老师不是那么关心代码是垃圾,而是在寻找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}
  }
};
Run Code Online (Sandbox Code Playgroud)

第一种形式被允许的唯一原因是因为它允许你写出类似的东西

int Multi[2][3][2] = {0};
Run Code Online (Sandbox Code Playgroud)

它将第一个元素显式初始化为0,其余元素显式初始化为静态存储持续时间(0).意味着所有元素都将设置为零.

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

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