为了正确回答你的问题,按行排列顺序阅读,这就是如何将多维阵列储存在C中。Wikipedia article 的文章有一点点太长,但其中之一可能更清楚:
http://webster.cs.ucr.edu/AoA/Windows/HTML/Arraysa2.html
http://archive.gamedev.net/archive/reference/articles/article1697.html
http://www.ibiblio.org/pub/languages/fortran/append-c.html
s 这个SO问题 也存在。
直接回答你的观点,假设你知道行-行-主储存是如何工作的:
int A[5][2][2][3]
宣布一个毗连的内存区域为5*2*3英寸长:五个阵列,每个阵列由三英寸组成的两个阵列组成。这些阵列以线性内存形式相互储存,以便
&A[0][0][0] == A
&A[0][0][1] == A+1
&A[0][1][0] == A+(1*3)
&A[3][1][2] == A+(3*(2*3))+(1*3)+2
A[1]
在技术上不是一个指针,而是一个阵列。它是一个 int [2][3]
阵列。但我发现,要考虑 A[5][2][3]
远比考虑 A[5][2][3]
要清楚得多,因为这是一个平坦的内存区,长30英寸。
A[0][0][0] is the first integer in that region.
A[0][0][1] is the second integer.
A[0][0][2] is the third integer.
A[0][1][0] is the fourth integer in this flat region.
A[0][1][1] is the fifth integer.
And so on until A[1][0][0] is the eleventh integer.
因此, A[1][0][0][0]
的地址是过去 A[0][0][0]
的10个整数; , 。由于C语言对于数组和指针之间的差异非常松散,因此, A[1]
被解释为您在表达中使用它时是一个地址,尽管它确实意指“由3个整数组组成的5个阵列组成的两个阵列中的第一个元素”,而“3个整数组组成的两个阵列”。
上图显示, A[1]
不 store a 指针,它 is a 指针。从 到 在多维数组中存储一个整数。
在(2)点和(3)点中,你所想到的是数组指针 ,它们不同。
这比用图片解释容易得多, 这就是为什么你应该找到一本关于C阵列的适当的教科书或文章。
一般来说,在学习C中的指针和阵列时,我建议你暂时忘记语言本身,并假装你是Dennis Ritchie 在PDP-11电脑上发明C, 带有56kb 平坦的 RAM 。 获得一张大图纸, 连续编号它的单元格, 假装它代表你的 RAM 和每个单元格是一个字节, 并且 < a href=" https://stackoverflow.com/ questions/706283/c-pointer-straction/7062888# 7062888" 您可以用铅笔和纸 来通过你的指针数学工作 。
C是在这种环境中发明的,理解其起源将使现代的建筑更加合理。
作为侧边的注意,当我试图写下这个答案时, Stack Overflows 标记语言反复改变,并破坏了我上面的数组示例中的索引。所以如果你看到任何数字在它们的数组中似乎超出范围, 编辑就引入了错误 。