3d数组中arr +1,* arr + 1,** arr + 1的含义

时间:2013-06-19 22:53:23

标签: c arrays

我有这个问题: 说起始地址是100。

int arr[2][3][2] = {{{2,4},{7,8},{3,4}},{{2,2},{2,3},{3,4}}};
printf(“%u %u %u %d \n”,arr,*arr,**arr,***arr); // Line 2
printf(“%u %u %u %d \n”,arr+1,*arr+1,**arr+1,***arr+1); // Line 3
}
Answer:
100, 100, 100, 2
114, 104, 102, 3

解释

对于第3行:第三维arr+1增加因此指向值 在114处,第二维的*a+1增量因此指向104,**arr +1 递增第一个维度,因此指向102,***arr+1首先得到 第一个位置的值,然后将其递增1.因此是第二行的输出。

Memory Layout

我的问题 - 我尽我所能。但我能得到3号线的解释!请解释

3 个答案:

答案 0 :(得分:10)

int arr[2][3][2]的类型是什么?它是int [3][2]类型的2个元素的数组。这是第三个维度。

什么是int [3][2]?它是int [2]类型的3个元素的数组。这是第二个维度。

什么是int [2]?它是int类型的2个元素的数组。这是第一个维度。

这是图

enter image description here

第2行:

  • arr指向第三维的第一个元素,
  • *arr指向第二维的第一个元素,
  • **arr指向第一维的第一个元素,
  • ***arr获取第一维的第一个元素的值。

您可以从图表中看到所有维度都从地址100开始。因此第2行的输出:“100,100,100,2”。

第3行:

  • arr + 1指向第三维的第二个元素,
  • *arr + 1指向第二维的第二个元素,
  • **arr + 1指向第一维的第二个元素,
  • ***arr + 1获取第一维的第一个元素的值并递增它。

您可以从图中看到第三维的第二个元素具有地址112(不是114!),第二维的第二个元素具有地址104,第一维的第二个元素具有地址{{1 }}。因此,第3行的输出必须是:“112,104,102,3”

答案 1 :(得分:2)

你的回答是错误的。第3行的第一个值应为112,而不是114。

当您对指针使用算术时,它会通过一些元素(数组存储的任何大小)更改地址。当你使用数组就好像它是一个指针一样,C会为你管理它。

当你使用arr时,编译器会说你有一个指向一个数组的指针,该数组包含两个int[3][2]类型的元素。因此,添加一个就意味着添加sizeof(int[3][2]),即12。这是一个表格来显示:

code      element type   ints per element    bytes per element   array length
-----------------------------------------------------------------------------
arr       int[3][2]      6                   12                  2
*arr      int[2]         2                   4                   3
**arr     int            1                   2                   2

答案 2 :(得分:0)

你的例子中的任何“解释”都没有多大价值。看,你搞混了。那是因为你的多 -ing( * * arr之类等)只是合情合理,如果你用C的malloc进行分配的话。那么2D数组的行是arr [i]类型(int *),并且在任何行中,列值是arr [i] [j]类型(int),并且整个2D矩阵是* arr的类型(int * )。在3D中,你有arr [i] [j] [k]类型(int),直到** arr为整个3D结构。但是使用int arr [2] [3] [2] = {...},只需使用arr [i] [j] [k]得到一个矩阵元素,即arr [0],arr [1]为行。对于那些编译时分配的2-3D矩阵,指针并不真正有用。永远记住* * arr是指向指针的指针,当且仅当有人出现并完成所有C-mallocing时。此致,M。