【问题标题】:How to create this formula?如何创建这个公式?
【发布时间】:2012-10-10 11:29:46
【问题描述】:

我进行了培训/家庭作业,以创建适用于 C 的以下公式:

如何计算整数矩阵中元素的地址,如果 矩阵的起始地址已知,大小已知, 元素的行和列是已知的。

假设矩阵是 a[b][c]。 则起始地址为a 或等效的&a[0][0]

行数为 b。

列数为 c。

每个元素的大小都应为sizeof(int),因此地址为a + b*sizeof(int) + a*sizeof(int)

这个公式正确吗?

【问题讨论】:

  • 所有你需要验证的是矩阵是如何存储在 C 中的。你的推理是完美的。
  • @Keyser 事实似乎是矩阵按行存储,首先是整个第一行,依此类推。感谢您的评论。

标签: c pointers matrix memory-address


【解决方案1】:

假设你有int array[b][c],你需要找到元素array[i][j]的地址。

a + i * c * sizeof(int) + j * sizeof(int)

其中,c * sizeof(int) 似乎是一个行大小,所以它的通用公式是

array_start + i * row_size + j * item_size

【讨论】:

    【解决方案2】:

    假设数组是按行存储的,这意味着如果你有:

    int array[N][M];
    

    那么,首先你有Mints对应array[0],然后你有Mints对应array[1]等等。

    因此:

    • array[0][c] 的地址由:(char *)array + c * sizeof(int) 给出
    • array[1][0] 的地址由:(char *)array + 1 * M * sizeof(int) 给出 因为 array[0]M int。
    • array[1][c] 的地址由:(char *)array + 1 * M * sizeof(int) + c * sizeof(int) 给出
    • array[2][0] 的地址由:(char *)array + 2 * M * sizeof(int) 给出
    • 希望您现在可以看到这种模式。 array[r][c] 的地址由 (char *)array + r * M * sizeof(int) + c * sizeof(int) 给出 也就是说,r * M 会跳过前r 行,然后跳过c 列。

    您可以查看this answer 了解有关 2D 内存布局的更多说明。同样的答案还包含动态数组的内存布局。

    【讨论】:

      【解决方案3】:

      这是另一种思考方式:

      首先使用这个方程计算那个元素的索引

      i = c + r * w
      

      其中c是列,r是行,w是矩阵/二维数组的宽度(列数)

      然后将其乘以整数的大小,得到元素相对于基地址的内存偏移量

      offset = i * sizeof(int);
      

      最后,将其添加到基地址:

      addr = base + offset
      

      所以公式是:

      addr =  base + (c+r*w) * sizeof(int)
      

      【讨论】: