C数组的结构
我有一个关于C数组如何存储在内存中的问题。但我在阐述这个问题时遇到了困难,所以我要尽力用语言来表达。我在英语方面有困难。假设我们有一个三维数组:C数组的结构,c,arrays,C,Arrays,我有一个关于C数组如何存储在内存中的问题。但我在阐述这个问题时遇到了困难,所以我要尽力用语言来表达。我在英语方面有困难。假设我们有一个三维数组: int foo[2][3][4]; 可以使用数组或指针表示法访问元素: foo[i][j][k] *(*(*(foo + i) + j) + k) 我们可以将数组视为指向int的指针,或者,例如,指向类似(*a)[2][3]的二维数组的指针 我思考的问题是:为了“提取”数组中的值,我们只需对数组的顶层(即[I])取消引用一次,对第二层(即[
int foo[2][3][4];
可以使用数组或指针表示法访问元素:
foo[i][j][k]
*(*(*(foo + i) + j) + k)
我们可以将数组视为指向int的指针,或者,例如,指向类似(*a)[2][3]的二维数组的指针
我思考的问题是:为了“提取”数组中的值,我们只需对数组的顶层(即[I])取消引用一次,对第二层(即[j])取消引用两次,对第三层(即[k])取消引用三次。但实际上,我们总是要去引用三次才能得到任何值。为什么会这样?还是真的是这样
我试着想象一下内存中的数组结构
很抱歉,我的表达方式很糟糕。您的数组数组
foo
在内存中的排列方式如下:
+--------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+----------+
| foo[0][0][0] | foo[0][0][1] | foo[0][0][2] | foo[0][0][3] | foo[0][1][0] | foo[0][1][1] | foo[0][1][2] | foo[0][1][3] | ... etc. |
+--------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+----------+
+--------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+----------+
|富[0][0][0]|富[0][0][1]|富[0][0][2]|富[0][0][3]|富[0][1][0]|富[0][1][1]|富[0][1][2]|富[0][1][3]|。。。等等|
+--------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+----------+
foo[0][0][0]
将位于最低的内存位置,foo[1][2][3]
将位于最高的内存位置
还有一个重要的注意事项:数组不是指针。它可以衰减为指向其第一个元素的指针,但请不要“认为”数组是指针
另一个重要注意事项:指针&foo
,&foo[0]
,&foo[0][0]
和&foo[0][0][0]
都指向同一位置,但它们都是不同的类型,这使得它们在语义上有所不同:
属于&foo
int(*)[2][3][4]
属于&foo[0]
int(*)[3][4]
属于&foo[0][0]
int(*)[4]
- 而
属于&foo[0][0][0]
int*
foo
衰减为&foo[0]
,foo[0]
衰减为&foo[0][0]
,foo[0][0]
衰减为&foo[0][0]
数组不像存储位置(内存地址)那么简单,而是具有类型和布局的对象
因此,在您的示例中,foo
是一个由3个数组组成的数组,其中4个数组是int
,其长度为2*f
是一个由4个int
数组组成的数组,**f
是一个int
数组
即使每个级别的解引用都提供相同的内存地址,但它们是不同的,因为它们具有不同的类型,因此相同位置的数据应该有不同的解释。“我们可以将数组视为指向int“no”的指针。将数组视为指向类似(*a)[2][3]的二维数组的指针。”有时候。结论:前者和后者是不同的。在C中,N维数组是由(N-1)维数组元素组成的一维数组,是。。。。。。。数组索引运算符只在指针类型的值上定义,而不是数组上定义-它只在数组上工作,因为它们衰减为指向第一个元素的指针,因此没有“数组或指针”notation@Some程序员伙计非常感谢你,是的,我想知道为什么&foo,foo,*foo**foo,都是同一个地址。有很多指南和书。如果只有一个,你能推荐一个吗?@一些程序员朋友,你能回答这个问题吗:我的问题是如何具体地将*(*(foo+i)+j)+k形式与三个指针联系起来?指向大小为3 x 4的int数组的指针,指向大小为4的int数组的指针,以及指向int的指针。