我有这个问题: 说起始地址是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.因此是第二行的输出。
我的问题 - 我尽我所能。但我能得到3号线的解释!请解释
答案 0 :(得分:10)
int arr[2][3][2]
的类型是什么?它是int [3][2]
类型的2个元素的数组。这是第三个维度。
什么是int [3][2]
?它是int [2]
类型的3个元素的数组。这是第二个维度。
什么是int [2]
?它是int
类型的2个元素的数组。这是第一个维度。
这是图
第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。