我想知道如何在三维数组中找到特定Index的内存地址而不用代码,例如我有array[5][5][6]
我希望在内存中找到索引元素array[2][2][2]
的位置我在内存中使用地址500
作为数组中的第一个元素。
答案 0 :(得分:0)
这取决于您使用的语言是否为其数组寻址/分配指定了row- or column-major order。
由于您在评论中提到了C,它使用了行主要方案,我将首先对其进行描述。
假设您有一个三维数组,int arr[X][Y][Z];
其中 X , Y , Z 是自然数。
示例可能是在多个网页上划分网格,其中感兴趣的数据具有特定的页面,行和列
我们对存储在给定点的数据感兴趣,( a , b , c )(即arr[a][b][c]
)。在主要系统中,点( a , b , c )表示 a < sup> th page , b th 行, c th 列
要使用行主系统计算该数组中给定点的偏移量,请使用以下计算:
offset = a*Y*Z + b*Z + c
所以
arr[a][b][c] == *(arr + a*Y*Z + b*Z + c)
在列主要系统中,指数的重要性相反。所以点( a , b , c )会描述 a th c th 页上的 b th 行中的sup>列。
因此,偏移变为:
offset = a + b*X + c*X*Y
即:
arr[a][b][c] == *(arr + a + b*X + c*X*Y)
为什么这有关系?局部性。它决定了你如何遍历数组。在行主系统中, last 索引是连续的,因为你应该在增加其他索引之前先迭代它,以便不跳过整个内存空间。在列主要系统中则相反。
假设我们有一个函数返回的6x7x8数组:int arr[6][7][8];
假设arr[0][0][0]
位于地址0x1000。在行主系统中,arr[0][0][1]
将为0x1001;紧邻arr[0][0][0]
。
在列主系统中,arr[0][0][1]
将位于0x102A,远不及(相对而言)arr[0][0][0]
。如果我们处理的是一个大型阵列并且没有意识到我们的语言实现了多数系统,那么我们可能会浪费大量时间,不必要地跨越整个内存空间。