【问题标题】:Equivalent syntax for accessing mutli-dimensional arrays in C在 C 中访问多维数组的等效语法
【发布时间】:2014-05-01 18:43:43
【问题描述】:

通过 knr,我已经达到了多维数组。

我想知道几件事:

首先。

假设我初始化以下数组

int a[2][4] = {{1,2,3},{4,5,6}};

现在,我将其理解为留出 2 个 4*sizeof(int) 字节的连续内存块。好吧,那么在我看来,这只是一种很好的方式来搁置乘法定义的内存。所以...为什么以下不正确:

int a[8] == int[2][4]

第二,当我去的时候,

int a[2][3] = {{1,2,3},{2,3,4}};

为什么这次尝试失败了

a[5] = 22;

如果多维数组不仅仅是一个连续的内存块,那么它是什么?

【问题讨论】:

  • int a[2,3] 不会编译。
  • captaincurrie,也许您应该编辑您的问题详细信息并修复 int a[2, 3]? (由 alk 发现)
  • int a[8] == int[2][4] 也不合法 C
  • int a[2,3]int a[3] 相同,很遗憾。
  • @DietrichEpp:我也想过这个,但是快速测试显示至少 gcc 4.7.2 拒绝它,错误为expected ‘]’ before ‘,’ token

标签: c arrays multidimensional-array


【解决方案1】:

如果您有 int a[2][4] 并且您尝试访问 a[1],则 a[1] 是 int[] 而不是 int强>。

换句话说,a[1] 是一个数组,而 a[1][1] 是一个整数值。

你需要投射才能做你想做的事。

【讨论】:

    【解决方案2】:
    T a[x][y][z];
    

    a是一个数组(带有x元素)数组(每个带有y元素)数组(每个带有z元素)类型为T

    更新

    如上定义的数组确实是一个连续的内存块。

    但是看到这样的一行

    T t = b[0][0[0];
    

    不知道a 是如何定义的并不一定意味着b 是一个连续的内存块,其中包含可通过索引b 在3 维中访问的所有元素。

    数组可以分散。

    例如

    T ** c1 = malloc(x * sizeof(*c1));
    for (size_t i = 0; i < x; ++i)
      c1[i] = malloc(y * sizeof(**c1));
    

    将允许您访问 c1x*y 元素,方式与您可以使用的方式完全相同

    T c2[x][y];
    

    c2 元素存储在一个连续的内存区域中,而c1 元素分散在x 大小为y 的区域中,与c1 大小的附加内存块相比,x * sizeof(*c1)大小为c2

    【讨论】:

    • 这些是 C 数组,而不是高级 python 数组。我的困惑源于 C 中的“低级”数组。 “连续的内存块”,而不是超级抽象的对象。对于多维数组,这种解释是错误的吗?这就是我真正想知道的
    • “高级”、“低级”、“Python”...? - 我不明白你吗?在 C 中声明数组只有一种方法。@captaincurrie
    • 我觉得在 Python 等高级语言中,数组是更抽象的对象,因为它们的行为方式是这样的。而在 C 语言中,如果不将“低级”“现实”理解为“连续的内存块”,则不能使用数组。我的困惑源于未能理解 C 多维数组的底层现实
    【解决方案3】:

    一个多维数组只是一个连续的内存块。但是,当您声明一个变量时,编译器希望您按照声明的方式使用该变量。因此,如果您将a 声明为带有行的二维数组

       int a[2][4] = {{1,2,3},{4,5,6}};
    

    那么编译器会将变量a 视为一个二维数组。

    如果您想将该数组作为一维数组访问,则需要声明另一个变量,例如

       int *b = (int *)a;
    

    然后你可以用这样的代码访问数组的元素

       for ( i = 0; i < 8; i++ )
           printf( "%d %d\n", i, b[i] );
    

    输出将是

    0 1
    1 2
    2 3
    3 0
    4 4
    5 5
    6 6
    7 0
    

    注意位置 3 和 7 处的零。这些元素是零,因为数组的每一行被声明为包含 4 个项目,但初始化程序每行只有 3 个项目。初始化程序中任何未指定的项都用零填充。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-13
      • 2021-10-11
      • 2020-02-01
      • 2021-12-31
      • 1970-01-01
      相关资源
      最近更新 更多