如何计算 3d 数组中的索引值在内存中的位置?如何计算字符**中的索引值在内存中的位置?

How to calculate where an indexed value in a 3d array will be in memory? How to calculate where an indexed value in a char** will be in memory?

本文关键字:索引值 内存 位置 何计算 计算 数组 字符 3d      更新时间:2023-10-16

>问题状态:给定以下数组声明和索引访问,计算索引值将位于内存中的地址。假设阵列从 64 位计算机上的位置 200 开始。

a. double d[3][4][4]; d[1][2][3] is at: _________
b. char *n[10]; n[3] is at: _________

我知道答案是416和224(分别(,但我不明白这些数字是如何达到的。

对于a部分,我被告知等式: 3d数组中的地址= 起始地址 + (p * numR * numC + (i * numC( + j( * 类型大小 (其中起始地址 = 200,numR 和 numC 来自原始数组,i、j 和 p 来自您尝试查找的位置(。

我所做的任何事情都不会使这个等式达到 416。我一直在查看数组的顺序为 d[行][列][平面]。这是不正确的吗?我也尝试将其视为 d[plane][row][column],但这似乎也不起作用。

对于 b 部分,我不确定从哪里开始,因为我认为由于数组是一个指针数组,它的位置将在堆中。我不确定如何从中获得 224。

我需要手动回答这些问题,而不是使用代码。

对于此数组声明

double d[3][4][4];

计算表达式的地址

d[1][2][3]

您可以使用以下公式

reinterpret_cast<double *>( d ) + 1 * 16 + 2 * 4 + 3

与 相同(相对于表达式的值(

reinterpret_cast<char *>( d ) + 27 * sizeof( double )

因此,您可以计算地址,例如数组第一个元素的地址加上表达式27 * sizeof( double )其中 double 等于 8。

对于此阵列

char *n[10];

表达式的地址

n[3]

reinterpret_cast<char *>( n ) + 3 * sizeof( char * )

用词来说:

给定大小为S的元素的通用数组 d[s1][s2][s3],d[x][y][z]元素的偏移量为

[(x * s2 * s3) + (y * s3) + z] * S

在数组double d[3][4][4]中,S = sizeof(double) = 8d[1][2][3]的位置在偏移量:

[(1 * 4 * 4) + (2 * 4) + 3] * 8 = 216

将偏移量 (216( 与起始偏移量 (200( 相加得到 416。

给定一个大小为S的元素的泛型数组 n[s1],n[x]元素的偏移量为

x * S

在数组char * n[10]中,S = 8(64 位平台上的指针大小(,n[3]的位置位于偏移量

3 * 8 = 24

将偏移量 (24( 与起始点 (200( 相加得到 224。

在代码中:

int main()
{
double d[3][4][4];
size_t start = 200;
size_t offset =
sizeof(d[0])       * 1
+ sizeof(d[0][0])    * 2
+ sizeof(d[0][0][0]) * 3;
std::cout << start + offset << std::endl; //416 on my machine
char * n[10];
offset = 3 * sizeof(char*);
std::cout << start + offset << std::endl; //224 on every 64bit platforms
}