维度大于3的数组地址

时间:2016-11-25 11:21:17

标签: c arrays array-address

什么是数学函数,它给出了具有3个以上维度的数组的地址? 我已经知道,对于具有2个维度的数组a[x][y](a (x * max_second_dimension + y) * byte)

3 个答案:

答案 0 :(得分:1)

让数组的维度为lxbxhxg,这意味着数组已使用

声明
data_type  array[l][b][h][g];

如果您想要array[x][y][z][a]的单元格地址,那么它将是

array + (x*b*h*g + y*h*g + z*g + a) * sizeof(array[x][y][z][a])

答案 1 :(得分:1)

给定数组a[N1][N2][N3]...[Nk],元素a[i1][i2]...[ik]的地址将等于:

a +
+ i1 * (N2 * N3 * ... * Nk) +
+ i2 * (N3 * N4 * ... * Nk) +
+ i3 * (N4 * N5 * ... * Nk) +
...
+ i(k - 1) * Nk +
+ ik

此处iN后面的内容是索引({1}}中的(k - 1)也是如此。

答案 2 :(得分:0)

对于任意维度的数组访问器有一个有限的公式,我将在下面解释。

但在此之前,你应该知道形式语言通常通过访问索引乘以内部数组大小的最顶层数组来处理语法规则中的多维数组 - 而这反过来又是由递归产生的。这可能最终在另一个数组中,由索引乘以内部数组大小访问,具有特定的偏移量,依此类推,直到被访问的元素不是数组。如果你想了解正式语言是如何工作的,你应该看看(例如)ANTLR。

当然,如果您知道尺寸的数量和每个尺寸的大小,您总能找到特定的表达式。例如:让a为数组的地址,s为维度大小数组,d维数,c索引数组(坐标为数组描述的空间和e元素大小。该地址将以伪代码进行评估:

a + e * sum(i := 0, d - 1, c[i] * prod(j := i + 1, d - 1, s[j]))

其中ij是循环变量而sumprod是大和/产品运算符,第二个上限和第二个上限相应参数。请注意,空产品操作员(最后一次迭代)结果为1.我没有对上述进行测试,但原则应该清楚。 Sorra,但我似乎无法在这里用数学符号发布公式。