多维数组如何存储在内存中? [复制]
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]
【讨论】:
以上是关于多维数组如何存储在内存中? [复制]的主要内容,如果未能解决你的问题,请参考以下文章