1

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

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

假设矩阵是 a[b][c]。那么起始地址是a或者等价的&a[0][0]

行数为 b。

列数为 c。

每个元素都应该有大小sizeof(int),所以地址就是a + b*sizeof(int) + a*sizeof(int)

这个公式正确吗?

4

3 回答 3

1

假设您有int array[b][c]并且需要找到 element 的地址array[i][j]

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

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

array_start + i * row_size + j * item_size
于 2012-10-10T11:39:01.663 回答
1

假设数组以行为主,这意味着如果您有:

int array[N][M];

然后,首先你有M ints 对应于array[0],然后你有M ints 对应于array[1]等等。

所以:

  • 的地址array[0][c]由以下给出:(char *)array + c * sizeof(int)
  • 的地址array[1][0]由以下给出:(char *)array + 1 * M * sizeof(int) 因为有Mint for array[0]
  • 的地址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列。

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

于 2012-10-10T11:41:35.120 回答
1

这是另一种思考方式:

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

i = c + r * w

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

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

offset = i * sizeof(int);

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

addr = base + offset

所以公式是:

addr =  base + (c+r*w) * sizeof(int)
于 2012-10-10T11:54:38.657 回答