2d阵列混乱

时间:2010-09-04 13:31:34

标签: c

为什么二维数组的内存是由两个参数访问的,而不是一个(忽略指针)。为什么内存图是按行和列而不是直的(水平),更多的原因是它说2d数组是一个数组数组但我不明白。

4 个答案:

答案 0 :(得分:7)

这是关于方便。当然,内存实际上都是顺序的,但有时人们希望能够使用两个索引访问事物(例如实现矩阵)。

考虑使用3x3阵列。想到这样的记忆很方便:

----------------------------
| [0][0] | [0][1] | [0][2] |
|--------------------------|
| [1][0] | [1][1] | [1][2] |
|--------------------------|
| [2][0] | [2][1] | [2][2] |
----------------------------

但在记忆中,它当然看起来像这样:

----------------------------------------------------------------------------------
| [0][0] | [0][1] | [0][2] | [1][0] | [1][1] | [1][2] | [2][0] | [2][1] | [2][2] |
----------------------------------------------------------------------------------

我们只是把它分成几行,这样我们就可以很容易地把它理解为二维的。我们使用两个参数访问它,因为我们想要,因为这对我们的代码来说很方便。该语言提供了这种实现,这使得可以通过两个索引进行访问,即使它是线性的,也可以用一个索引访问。

这张图片也应该可以帮助您理解为什么它可以被视为一个数组数组。这是一个略微修改过的图片,重点是:

|||--------------------------|||--------------------------|||--------------------------|||
||| [0][0] | [0][1] | [0][2] ||| [1][0] | [1][1] | [1][2] ||| [2][0] | [2][1] | [2][2] |||
|||--------------------------|||--------------------------|||--------------------------|||

正如您所看到的,那里有三个一维数组。因此,当您编写array[1]时,您指的是完整二维数组的第二个一维组件,即内存中的第二组三个组件。添加第二个索引array[1][2]获取该一维数组的第三个元素,根据需要将您转到二维数组的单个元素。

答案 1 :(得分:1)

所有关于:

之间的差异
 1  2  3  4  5  6  7  8  9  
[A][A][A][A][A][X][A][A][A]

      1  2  3  4  5  6  7  8 
  1  [A][A][A][A][A][A][A][A]
  2  [A][A][A][A][A][A][A][A]
  3  [A][A][A][A][A][A][A][A]
  4  [A][A][A][A][X][A][A][A]
  5  [A][A][A][A][A][A][A][A]
  6  [A][A][A][A][A][A][A][A]

在上述数据中找到X:

在第一个,为了访问一个地址你只需要一个索引(6是X位置)

但在第二个中你有两个索引来识别一个地址(4:5是X位置)。

您可以将第二个表视为第一个数组的数组。

请注意,这些数组的内存分配与我在示例中看到的不同。我的样本只是为了更好地理解

答案 2 :(得分:1)

这就是为什么你不在数学笔记本中将二维矩阵写成一系列整数的原因。它只是意味着它们代表了两种不同的特征。对于例如屏幕上的像素可以使用A[i] { i => 0 to N^2 }表示为单个数组,但当有人要求您在第10行显示第4个像素时,您不希望每次都自己进行乘法运算吗?相反,您只需返回A[10][4]

答案 3 :(得分:0)

上面的答案都没问题。但他们只讲述了故事的一半。现在我要告诉你另一半你必须要有两个变量来索引二维数组。 这是在堆上声明二维数组而不是堆栈时。 C中常见的访谈问题是“你将如何动态创建二维数组?”。

代码段如下: -

int **p = (int **)malloc(n * sizeof(int*));

for(int i =0;i < n;i++){

p[i] = (int *)malloc(n * sizeof(int));

}

在这种情况下,如果你想转到第三行第二列元素你不能这样做 int elem = p[2*n + 1]. 简单的原因是类型不相同p [2 * n + 1]是int *类型。要获得所需的元素,必须执行p [2] [1]。

请不要忽视对问题的评论。 2D数组的自然概念是内部的任何元素都需要两次重定向才能到达它。一步访问它没有任何区别。它甚至可能不会紧固事物。

要知道我在说什么,请考虑一个声明为int p[20][20]; 的数组 现在如果你认为如果你访问p [2] [1]比访问p [2 * 20 +1]慢,那你又错了。为什么?因为内部编译器正在做同样的事情。最多只需几微秒的编译时间。你知道谁在乎编译时节省几微秒?

没有人。