前段時間刷題中,無意發現自己對多維數組和指針的關系不是很明確,開始google,沒發現太靠譜的,於是翻書,果然在《C Primer Plus》中找到一段,分析的如此透徹,是不是這個太基礎了,以至於別人都不願意在網上寫出來,以下摘自書中,並加上自己的理解:
指針和多維數組有什麼關系?為什麼我們需要知道它們之間的關系?函數是通過指針來處理多維數組的,因此在使用這樣的函數之前,您需要更多地了解指針。對於第一個問題,讓我們通過幾個例子來找出答案。為簡化討論,我們采用比較小的數組。假設有如下的聲明:
1 int zippo[4][2]; /*整數數組的數組*/
數組名zippo同時也是數組首元素的地址。在本例中,zippo的首元素本身又是包含兩個int的數組,因此zippo也是包含兩個int的數組的地址。下面從指針屬性進一步分析:
1 //多維數組和指針
2
3 #include<iostream>
4
5 int main()
6 {
7 int zippo[4][2] = {{2,4},
8 {6,8},
9 {1,3},
10 {5,7}};
11
12 //首先驗證第一個結論
13 //%p對應的數據類型為void*,輸出是以16進制形式輸出指針的值
14 printf("=======驗證第一條結論========\n");
15 printf("zippo:\t\t%p\n&zippo[0]:\t%p\n",zippo,&zippo[0]);
16 printf("zippo[0]:\t%p\n&zippo[0][0]:\t%p\n",zippo[0],&zippo[0][0]);
17 printf("*zippo:\t%p\n",*zippo);
18 printf("\n");
19 printf("=======驗證第二條結論========\n");
20 //zippo包含2個int,那麼+1後向後移動8字節
21 printf("zippo:\t\t%p\nzippo+1:\t%p\n",zippo,zippo+1);
22 //zippo[0]包含1個int,那麼+1後向後移動4字節
23 printf("zippo[0]:\t%p\nzippo[0]+1:\t%p\n",zippo[0],zippo[0]+1);
24 printf("\n");
25 printf("=======驗證第三條結論========\n");
26 //驗證:*和[]的作用是相同的,都是對地址(指針)取值
27 printf("*zippo:\t%p\nzippo[0]:\t%p\n",*zippo,zippo[0]);
28 printf("*(zippo+1):\t%p\nzippo[1]:\t%p\n",*(zippo+1),zippo[1]);
29 //驗證:**zippo與zippo[0][0]相等,即zippo是指針的指針
30 printf("**zippo:\t%d\nzippo[0][0]:\t%d\n",**zippo,zippo[0][0]);
31 printf("*(*(zippo+2)+1)\t%d\nzippo[2][1]:\t%d\n",*(*(zippo+2)+1),zippo[2][1]);
32 return 0;
33 }
輸出結果:
