多维数组如何存储在内存中? [复制]

Posted

技术标签:

【中文标题】多维数组如何存储在内存中? [复制]【英文标题】:How are multidimensional arrays stored in memory? [duplicate] 【发布时间】:2017-06-05 17:15:59 【问题描述】:

我正在学习指针和多维数组。

我知道它们是由几个像这样一个接一个排列的子阵列组成的。

int C[3][2][2];

在本例中 C = 800 这是指向 3 整数数组的第一个数组元素的指针。

所以,我假设保留了一块内存来存储引用变量 C 像这样

我不明白解引用如何处理数组。

在正常情况下*C表示获取存储在地址800的值。所以*C = 2

但这里 *C 将是 800。我从逻辑上理解这一点。这是一个指向里面的2整数数组的指针。

但是编译器是怎么理解的呢?内存中其他数组的信息在哪里?

截图来源 - mycodeschool youtube channel

【问题讨论】:

编译器知道数组的维度。它不知道它们是否已经衰减为指针。 例如,当您编写&C[1] 时,如果sizeof(int) 为4,编译器会将其转换为添加(address of C) + 16 如果除了数组之外还声明了一个指针,那么在 900 处只有一个单独的变量。该数组不需要任何其他信息。 【参考方案1】:

当您声明一个静态数组 tab[x][y] 时,编译器将使用 tab[x * y] 并计算正确的偏移量。它不像双指针那样工作,比如 char **tab。在这种情况下,您有一个指针数组,每个指针都指向一个字符数组。

当您使用静态数组声明函数时,您必须指定除最后一个之外的维度的大小。 例如:

无效 fn(char t[4][5][6][])

而 t[x][y][z][a] 将被替换为每 t[x × 4 × 5 × 6 + y × 5 × 6 + z × 6 + a]

【讨论】:

以上是关于多维数组如何存储在内存中? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中按升序对多维数组进行排序? [复制]

如果数组存在于另一个多维数组中,如何从多维数组中删除该数组? [复制]

如何在 Javascript 中创建多维数组? [复制]

如何在php中获取多维数组中动态的第一个键? [复制]

多维数组如何在内存中格式化?

在Java中深度克隆多维数组......? [复制]