对于声明为as-int的整数数组arr [4] [3] [2]
&arr
arr
arr[0]
&arr
arr[0][0]
&arr[0][0]
arr[0][0][0]
&arr[0][0][0]
我的分析:
arr
: - 指向三维数组的基地址&arr
: - 和arr一样,数组名称不会分解arr[0]
: - 指向3维数组的第一个元素的指针,该数组是指向2d数组的基址的指针arr[0][0]
:指向第一个3D数组的第一个2D数组的第一个单元格的第一个元素的指针。我在考虑正确的线路吗?其中哪些是指向同一件事?
int arr[4][3][2]
意味着arr
是3D
阵列,包括four 2D
阵列,每个2D
阵列有three 1D
阵列和每个1D array
有two-two
元素。
让我们有一个arr
的图形表示:假设arr
基地址是0x100
。
arr[0][0][0] arr[1][0][0] arr[2][0][0] arr[3][0][0]
0x100 0x104 0x108 0x112 0x116 0x120 0x124 0x128 0x132 0x136 0x140 0x144 0x148 0x152 0x156 0x160 <--1D array elements
| | | | | | | | | | | | | | | |
---------- -------- ---------- ---------- ---------- ----------- ------------ ---------------
| | | | | | | |
arr[0][0] arr[0][1] arr[1][0] arr[1][1] arr[2][0] arr[2][1] arr[3][0] arr[3][1]
0x100 0x108 0x116 0x124 0x132 0x140 0x148 0x156 <---1D array
| | | | | | | |
------------------------ ------------------------- ------------------------- ------------------------
| | | |
arr[0] arr[1] arr[2] arr[3] <---2D array
0x100 0x116 0x132 0x148
| | | |
-------------------------------------------------------------------------------------------------------------------------
|
arr <---3D array
0x100
如果你分析上面的数字,你会发现arr
,arr[0]
,arr[0][0]
和&arr[0][0][0]
都是same
,所有都持有arr
基地址是0x100
。
请注意,arr[0][0][0]
是value
但是&arr[0][0][0]
是第一个元素的address
,所以两者都是different
。
arr
和&arr
也same
因为arr名称本身的地址所以通过推杆并没有任何区别。
arr[0][0]
和&arr[0][0]
也是一样的,因为arr[0][0]
是一维数组,即single pointer
指向两个元素,称为arr[0][0][0]
和arr[0][0][1]
。如
arr[0][0] == & arr[0][0]
*( *(arr+0) + 0) == & *( *(arr+0) + 0)
*( *(0x100 + 0x16) + 0) == & *( *(0x100 + 0x16) + 0)
*( *(0x100)) == & *( *(0x100))
*( 0x100) == & *( 0x100)
0x100 == & 0x100
0x100 == 0x100