多維數組和指針探討

        前段時間刷題中,無心發現本身對多維數組和指針的關係不是很明確,開始google,沒發現太靠譜的,因而翻書,果真在《C Primer Plus》中找到一段,分析的如此透徹,是否是這個太基礎了,以致於別人都不肯意在網上寫出來,如下摘自書中,並加上本身的理解:ios

 分析

指針和多維數組有什麼關係?爲何咱們須要知道它們之間的關係?函數是經過指針來處理多維數組的,所以在使用這樣的函數以前,您須要更多地瞭解指針。對於第一個問題,讓咱們經過幾個例子來找出答案。爲簡化討論,咱們採用比較小的數組。假設有以下的聲明:數組

 
1 int zippo[4][2];  /*整數數組的數組*/
 

數組名zippo同時也是數組首元素的地址。在本例中,zippo的首元素自己又是包含兩個int的數組,所以zippo也是包含兩個int的數組的地址。下面從指針屬性進一步分析:函數

  • 由於zippo是數組首元素的地址,因此zippo的值和&zippo[0]相同(若這樣,那麼*zippozippo[0]是相同的)。另外一方面,zippo[0]自己是包含兩個整數的數組,所以zippo[0]的值同其首元素(一個整數)的地址&zippo[0][0]相同。簡單地說,zippo[0]是一個整數大小對象的地址,而zippo是兩個整數大小對象的地址。由於整數和兩個整數組成的數組開始於同一個地址,所以zippozippo[0]*zippo也相同)具備相同的數值。
  • 對一個指針(也即地址)加1,會對原來的數值加上一個對應類型大小的數值。在這方面,zippozippo[0]是不同的,zippo所指向對象的大小是兩個int,而zippo[0]所指向對象的大小是一個int。所以zippo+1zippo[0]+1的結果不一樣。
  • 對一個指針(也即地址)取值(使用運算符*或者帶有索引的[]運算符)獲得的是該指針所指向對象的數值。由於zippo[0]是其首元素zippo[0][0]的地址,因此*(zippo[0])表明存儲在zippo[0][0]中的數值,即一個int數值。一樣,*zippo表明其首元素zippo[0]的值,可是zippo[0]自己就是一個int數的地址,即&zippo[0][0],所以*zippo&zippo[0][0]。對這兩個表達式同時應用取值運算符將獲得**zippo等價於*&zippo[0][0],後者簡化後即爲一個intzippo[0][0]。簡言之,zippo是地址的地址,須要兩次取值才能夠獲得一般的數值。地址的地址或指針的指針是雙重間接的典型例子。

代碼

 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 } 

輸出結果:google

相關文章
相關標籤/搜索