程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 多維數組和指針探討,多維數組指針探討

多維數組和指針探討,多維數組指針探討

編輯:C++入門知識

多維數組和指針探討,多維數組指針探討


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

 分析

指針和多維數組有什麼關系?為什麼我們需要知道它們之間的關系?函數是通過指針來處理多維數組的,因此在使用這樣的函數之前,您需要更多地了解指針。對於第一個問題,讓我們通過幾個例子來找出答案。為簡化討論,我們采用比較小的數組。假設有如下的聲明:



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

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

  • 因為zippo是數組首元素的地址,所以zippo的值和&zippo[0]相同(若這樣,那麼*zippo和zippo[0]是相同的)。另一方面,zippo[0]本身是包含兩個整數的數組,因此zippo[0]的值同其首元素(一個整數)的地址&zippo[0][0]相同。簡單地說,zippo[0]是一個整數大小對象的地址,而zippo是兩個整數大小對象的地址。因為整數和兩個整數組成的數組開始於同一個地址,因此zippo和zippo[0](*zippo也相同)具有相同的數值。
  • 對一個指針(也即地址)加1,會對原來的數值加上一個對應類型大小的數值。在這方面,zippo和zippo[0]是不一樣的,zippo所指向對象的大小是兩個int,而zippo[0]所指向對象的大小是一個int。因此zippo+1和zippo[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],後者簡化後即為一個int數zippo[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 } 

輸出結果:

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved