我进行了培训/作业以创建适用于 C 的以下公式:
如何计算整数矩阵中元素的地址,如果矩阵的起始地址已知,则大小已知并且元素的行和列已知。
假设矩阵是 a[b][c]。那么起始地址是a
或者等价的&a[0][0]
行数为 b。
列数为 c。
每个元素都应该有大小sizeof(int)
,所以地址就是a + b*sizeof(int) + a*sizeof(int)
这个公式正确吗?
我进行了培训/作业以创建适用于 C 的以下公式:
如何计算整数矩阵中元素的地址,如果矩阵的起始地址已知,则大小已知并且元素的行和列已知。
假设矩阵是 a[b][c]。那么起始地址是a
或者等价的&a[0][0]
行数为 b。
列数为 c。
每个元素都应该有大小sizeof(int)
,所以地址就是a + b*sizeof(int) + a*sizeof(int)
这个公式正确吗?
假设您有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
假设数组以行为主,这意味着如果您有:
int array[N][M];
然后,首先你有M
int
s 对应于array[0]
,然后你有M
int
s 对应于array[1]
等等。
所以:
array[0][c]
由以下给出:(char *)array + c * sizeof(int)
array[1][0]
由以下给出:(char *)array + 1 * M * sizeof(int)
因为有M
int 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 内存布局的更多说明。同样的答案还包含动态数组的内存布局。
这是另一种思考方式:
首先使用这个方程计算那个元素的索引
i = c + r * w
其中 c 是列,r 是行,w 是矩阵/二维数组的宽度(列数)
然后将它乘以整数的大小,得到元素相对于基地址的内存偏移量
offset = i * sizeof(int);
最后,将其添加到基地址:
addr = base + offset
所以公式是:
addr = base + (c+r*w) * sizeof(int)