聊一聊指針與二維數組

指針與一維數組的關係:

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)個位置。

因此打印二維數組裡面所有的元素可以這樣。

聊一聊指針與二維數組


分享到:


相關文章: