解析數組名 作者:黑色印記
很多剛接觸C語言的朋友總會覺得數組和指針是十分復雜的,特別對於多維數組的問題,感到頭痛無比。我認為困惑大家的是對於數組名的理解不清晰所造成的。在這裡,我將從一維數組名,二維數組名,三維數組名,向大家解析其中的注意事項。
在進入正題前,我想讓大家知道,數組名是一個指針常量,保存的是首元素的地址。(因此,數組名不能做自加操作)
一維數組:
例:
int a [ 2 ] ;
a 保存的是數組首元素的地址 a +1,增加4個字節
&a
保存的是數組的地址 a +1,增加8個字節
(一個是元素地址,一個是一維數組的地址,注意區分兩者的區別)
由 *(&a) = a
可知: 對數組的地址取值等於數組首元素的地址.
二維數組:
例:
int a[ 2 ] [ 2 ] ;
由於a是二維數組的數組名,所以它的首元素是一個一維數組。
a + i 第i個一維數組的地址
*( a + i ) + j
第i個一維數組的第j個元素的地址
*(*(a + i) + j)
第i個一維數組的第j個元素的值
因為a是一維數組的地址,所以,要用數組指針來接。即:
int
(*pa)[ 2 ] = a ; pa + 1 ,加8個字節
因為&a是二維數組的地址,所以,要用二維數組指針來接。即:
int
(*pa)[2][2] = &a; pa + 1 , 加16個字節
三維數組:
例:
int a[2][2][2];
和二維數組同理,同學們可以嘗試自己理解一下。
a + i
第i個二維數組的地址
*(a + i) + j
第i個二維數組的第j個一維數組的地址
*(*(a + i) + j) + k
第i個二維數組的第j個一維數組的第k個元素的地址
int
(*pa)[2][2] = a; pa + 1, 加16個字節
int
(*pa)[2] = *a ; pa + 1,
加8個字節
int (*pa) = **a ;
pa + 1, 加4個字節
int
(*pa)[2][2][2] = &a; pa + 1,
加32個字節
如果用畫圖的方式表示數組中的元素,在內存中的存放方式,會更加容易理解,有條件的同學可以試一試。