Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C数组的结构_C_Arrays - Fatal编程技术网

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])取消引用一次,对第二层(即[

我有一个关于C数组如何存储在内存中的问题。但我在阐述这个问题时遇到了困难,所以我要尽力用语言来表达。我在英语方面有困难。假设我们有一个三维数组:

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的指针。