C++多维数组初始化

3

我在书中找到了一个例子

static int categoryTable[ 2 ][ 2 ][ 2 ] = {
    //!b!c  !bc  b!c  bc
      0,    3,   2,   2, //!a
      1,    2,   1,   1  // a
};

category = categoryTable[ a ][ b ][ c ]

有错误,对吗?

正确的变体是

static int categoryTable[ 2 ][ 2 ][ 2 ] = {
    //!b!c   !bc    b!c  bc
     {{0,    3},   {2,   2}}, //!a
     {{1,    2},   {1,   1}}  // a
};

或者原来的是正确的,我没理解到什么?

1
如果我没记错的话,两者都可以编译。编译器会以相同的方式将它们存储在内存中。 - Beefster
2个回答

3

正如Beefster所说,两种方式都是正确的且可以编译。

多维数组对于编译器来说只是普通的单维数组,但对于程序员来说,它们是复杂指针算术的一种简洁语法。

因为多维数组实际上是一个带有语法改进的单维数组,所以没有必要禁止使用单个初始化列表进行初始化。

表达式

a[0][2][3] = x;

这相当于 *(a+(0*DIM_1+2)*DIM_2+3) = x;

虽然不是你问题的一部分,但有趣的是,由于这只是指针算术运算,你可以这样写:

3[a]

那相当于数组订阅:

a[3]

有趣的是,您可以使用多维数组进行类似的操作:

#include <stdio.h>

static int categoryTable[ 2 ][ 2 ][ 2 ] = {
    //!b!c  !bc  b!c  bc
      0,    3,   2,   2, //!a
      1,    2,   1,   1  // a
};

int main() {
  // This two printf's are equivalent
  printf("%d\n", 0[0[categoryTable][1]]);
  printf("%d\n", categoryTable[0][1][0]);
  return 0;
}

这是一个相当丑陋的不要做的事情,但还是很有趣的。
因此,您可以将订阅视为一种数学表达式,以访问单个平面数组 - 没有什么特别的。

多维数组实际上只是带有简洁语法的单维数组 - 因此,static int categoryTable[ 2 ][ 2 ][ 2 ] = {...}; 本质上是 static int categoryTable[8] = {...};,这就是为什么可以使用一组花括号来初始化其元素。 - Remy Lebeau

3
两者都是正确的。你可以使用任何一个。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接