指針與一維數組的關係:
1.一維數組(int型):int buf[5]={1,2,3,4,5};
數組名就是首地址,數組是一塊連續同類型的空間,因此定義一個指針指向數組首地址就可以表示數組。
int *pa=buf;
但是一維數組只有一行,並沒有列。
指針與二維數組:
2.二維數組(int型):int buf[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}
int *pb=buf;
二維數組的指針分為行指針和列指針,pb指向的是第一行,pb+1指向的是第一行,驗證方法是將pb和pb+1打印出來,看他們的地址是否連續,即相隔sizeof(int)。
pb[0]或者是*pb是列指針,指向第一行的第一列,或者可以理解為pb[0],pb[1],pb[2]是每一行的首地址;
注:分別打印&buf[0][0], buf ,buf[0],發現他們的地址都相同,但是意義不同,如圖所示,這三個指針分別代表第一行第一個元素的地址,第一行指針,第一行的列指針(第一行元素首地址)
引用二維數組裡面的元素需要將下標精確到行和列,例如第2行第3個元素buf[1][2],這個表示方法大家都知道。那麼如何用指針表示呢,我們可以用拆分的方法。表示方法有8種,嚴格來說只有四種。
1.*(pb[1]+2) pb[1]代表列指針,指向第二行第1列,向右移兩個位置再取值
2.*(pb+1)[2] pb+1行指針,指向第二行,*(pb+1)表示第二行首地址。
注:有人感到疑惑,* 不是引用地址裡面的元素嗎,那麼*(pb+1)不就是第二行的元素?請注意第二行是一個數組,下標法和指針法都是引用數組裡面的一個元素,不可能直接是取出一組數組,這個地方記住是取第二行的首地址就行了。
3.pb[1][2]
4.*(*(pb+1)+2)
二維數組的邏輯地址如上圖所示,但是二維數組在物理空間裡面的地址跟一維數組是一樣的。驗證方法打印每一行最後一個元素和下一行第一個元素,發現他們的空間只隔了sizeof(int)個位置。
因此打印二維數組裡面所有的元素可以這樣。
閱讀更多 e客小眾 的文章