【问题标题】:What does 2d-array- arr[][0] means?2d-array-arr[][0] 是什么意思?
【发布时间】:2016-02-21 08:44:24
【问题描述】:

如果二维数组的格式是arr[n][0],那么这是一个一维数组吗? 如果列数为0,它是如何存储在内存中的?

【问题讨论】:

  • 你能告诉我们这是在哪里使用的吗?
  • 为了得到“正确”的答案,你必须把你的问题放在上下文中,即在代码中显示它。
  • 如果列数为0,则为空。这不合法 C. 你还能期待什么?如果列数为 1,那么您的问题至少是有道理的。

标签: c arrays memory


【解决方案1】:

作为补充回答:

二维数组平铺在内存中,是地址的线性集合。

如果您像这样可视化一个 4X4 数组:

[0][0][0][0]
[1][1][1][1]
[2][2][2][2]
[3][3][3][3]

数组在内存中的布局如下:

[0][0][0][0][1][1][1][1][2][2][2][2][3][3][3][3]

例如,当声明一个将二维数组作为参数的函数时,您始终需要提供数组第二部分的大小。

您可以同时提供,也可以只提供第二个:
int func(int array[4][4])int func(int array[0][4])
但您不能同时省略两者或只提供第一个尺寸。

为什么?因为只需要特定的大小来进行正确的指针运算:

例如,为了使用array[3][2],我们向下移动 3 行,跨 2 行,每行是 4 integers 宽 = 4 * 3 整数槽,然后添加 2 更多整数槽以到达第三个元素.
array[3][2]变成指针运算*(array + 3 * <width of array> + 2)

array[3][2] == *((int*)array + 3 * 4 + 2)

查看this 的答案,了解为什么存在(int*)

【讨论】:

    【解决方案2】:

    如果你的意思是像这样的数组声明

    T arr[n][0];
    

    如果T 是类型说明符,那么它是无效的。

    根据 C 标准(6.7.6.2 数组声明符)

    1 除了可选的类型限定符和关键字 static, [ 和 ] 可以分隔表达式或 *。如果他们界定一个表达式 (指定数组的大小),表达式应具有 整数类型。如果表达式是一个常量表达式,它应该 具有大于零的值....

    【讨论】:

      【解决方案3】:

      秘密地,我认为它作为一维数组存储在内存中。 2D是给我们用的,不是给电脑用的。

      关于 arr[n][0] 的问题,列数不是 0。arr[n][0] 仅表示您正在尝试访问第 n 行第 0 列的元素。基本上第一行中的任何元素。你仍然有一个二维数组而不是一维数组。

      【讨论】:

        猜你喜欢
        • 2022-06-16
        • 1970-01-01
        • 2023-02-11
        • 1970-01-01
        • 2010-11-19
        • 1970-01-01
        • 1970-01-01
        • 2015-03-20
        • 2020-01-07
        相关资源
        最近更新 更多