前段時間刷題中,無意發現自己對多維數組和指針的關系不是很明確,開始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 }
輸出結果: