最近學完了C語言指針的基本內容,開始學習多維數組與指針,寫下一點自己的學習心得。C語言中的多維數組指針是比較複雜的,需要多理解和多思考,先舉個例子,對於一個二維數組a,他有三行四列。如圖所示:
a[0] |
1 |
3 |
5 |
7 |
a[1] |
9 |
11 |
13 |
15 |
a[2] |
17 |
19 |
21 |
23 |
可以看到這個數組包含了12個元素,一共有3行,4列,我們可以這樣看,這個二維數組是由3個一維數組所組成的,每個一維數組又包含了4個元素,a[0][0],a[0][1],a[0][2]
在一維數組中,a代表了數組的首元素地址,那麼在二維數組中,a代表了就是第0行的首地址,那麼第一行的首地址就是 a+1, 如果我們說第0行的首地址是2000,在Turbo C 中第1行的地址就是2008,因爲第0行有4個整型數據,他們在內存單元中佔據了4*2=8個內存單元,所以a+1的首地址就是2008,那麼由此可以推導出,a+1就是a[1]的地址,同理可以推導出 a+2就是a[2]的首地址……
a[0] a[1] a[2]是一維數組名,C語言規定 數組名代表數組首元素的地址,所以a[0]就是a[0][0]的地址,也就等於&a[0][0] a[1]=&a[1][0] a[2]=&a[2][0]
那麼 第0行1列的元素地址怎麼表示呢? a[0]這個一維數組名代表的是第0行的首地址,注意,a代表的是列的首地址,而a[0]則代表的是行的首地址,如果說第1行是a+1,那麼第一列就是a[0]+1,以此類推…… 因爲a指向的是a[0]的地址。所以a其實是一個指針變量,他存放的是a[0]的地址,然而a[0]則存放的是a[0][0]的首地址,那麼前面已經知道,*a等於a[0],因爲a中存放的是a[0]所在的地址,那麼我們要求a[0][0]的地址就應該是* *a,或者*a[0],也就是說,這個指針其實有兩個指向。請看圖:
看圖應該就很清楚了,寫到這裏,如有錯誤望各位前輩請多多指教