C語言中多維數組的理解

  1.   
  2. #include <stdio.h>  
  3.   
  4. #define ROW 4  
  5. #define COL 2  
  6. int main(void)  
  7. {   
  8.       
  9.     int zippo[ROW][COL] = {{2,4},{6,8},{1,3},{5,7}};  
  10.       
  11.     int i,j;  
  12.   
  13.     printf(" \n \n");  
  14.   
  15.     for(i=0;i<ROW;i++)  
  16.     {         
  17.         printf("  &zippo[%d]=%p\n",i,&zippo[i]);          
  18.     }  
  19.   
  20.     printf(" \n \n");  
  21.   
  22.     for(i=0;i<ROW;i++)  
  23.     {  
  24.         for(j=0;j<COL;j++)  
  25.         {  
  26.             printf("  &zippo[%d][%d]=%p\n",i,j,&zippo[i][j]);  
  27.         }  
  28.     }  
  29.   
  30.     printf(" \n \n");  
  31.   
  32.     printf("  an integer user %d bytes\n",sizeof(int));  
  33.   
  34.     printf(" \n \n");  
  35.       
  36.     printf("  zippo= %p,  &zippo=%p, zippo+1= %p\n",zippo,&zippo,zippo+1);  
  37.     //zippo是數組首元素的地址,它儲存的值即是它本身的地址,zippo=&zippo  
  38.     //可以理解爲它指向一個包含4元素的一維數組A  
  39.     //zippo+1表示指向A第二個元素,即zippo[1]  
  40.   
  41.     printf("  zippo[0]= %p,ziopo[0]+1= %p\n",zippo[0],zippo[0]+1);    
  42.     //zippo[0]是zippo A數組中的第一個元素,可以理解爲它指向一個包含2元素的一維數組B  
  43.     //zippo[0]+1表示指向zippo[0]的下一個元素,即&zippo[0][1]  
  44.   
  45.     printf("  *zippo= %p , *zippo+1=%p\n",*zippo,*zippo+1);  
  46.     //*zippo表示取zippo指向的地址,即&zippo[0]  
  47.     //*zippo+1表示取zippo[0]指向的下一個地址,即zippo[0]+1,亦即 &zippo[0][1]  
  48.     printf("  zippo[0][0]= %d\n",zippo[0][0]);  
  49.       
  50.     printf("  *zippo[0] =%d\n",*zippo[0]);  
  51.     //*zippo[0]對zippo[0]指向的地址取值,相當於zippo[0][0],因爲zippo[0]指向數組B的第一個元素,  
  52.     printf("  **zippo=%d\n",**zippo);  
  53.   
  54.     printf(" \n \n");  
  55.       
  56.     printf("  zippo[2][1]= %d\n",zippo[2][1]);  
  57.   
  58.     printf("  *(*(zippo+2)+1)= %d\n",*(*(zippo+2)+1));  
  59.     //*zippo=*(zippo+0)=zippo[0]  
  60.     //*(zippo+2)=zippo[2]  
  61.     //*(*(zippo+2)+1)=zippo[2][1]  
  62.     //結論:*(*(zippo+m)+n)=zippo[m][n]  
  63.     //對N維的數組取值時要用到N個*  
  64.     return 0;  
  65. }  






運行結果:

  1. jiang@ubuntujeos:~/c/20110825$ gcc testarray.c -o   
  2.   
  3. testarray.o;./testarray.o  
  4. testarray.c:55:2: warning: no newline at end of file  
  5.   
  6.   
  7.   &zippo[0]=0xbf9f925c  
  8.   &zippo[1]=0xbf9f9264  
  9.   &zippo[2]=0xbf9f926c  
  10.   &zippo[3]=0xbf9f9274  
  11.   
  12.   
  13.   &zippo[0][0]=0xbf9f925c  
  14.   &zippo[0][1]=0xbf9f9260  
  15.   &zippo[1][0]=0xbf9f9264  
  16.   &zippo[1][1]=0xbf9f9268  
  17.   &zippo[2][0]=0xbf9f926c  
  18.   &zippo[2][1]=0xbf9f9270  
  19.   &zippo[3][0]=0xbf9f9274  
  20.   &zippo[3][1]=0xbf9f9278  
  21.   
  22.   
  23.   an integer user 4 bytes  
  24.   
  25.   
  26.   zippo= 0xbf9f925c,  &zippo=0xbf9f925c, zippo+1= 0xbf9f9264  
  27.   zippo[0]= 0xbf9f925c,ziopo[0]+1= 0xbf9f9260  
  28.   *zippo= 0xbf9f925c , *zippo+1=0xbf9f9260  
  29.   zippo[0][0]= 2  
  30.   *zippo[0] =2  
  31.   **zippo=2  
  32.   
  33.   
  34.   zippo[2][1]= 3  
  35.   *(*(zippo+2)+1)= 3  

爲了方便看地址,我把十六進制的地址轉換成十進制


bf9f925c   3214905948
bf9f9260   3214905952
bf9f9264   3214905956
bf9f9268   3214905960
bf9f926c   3214905964
bf9f9270   3214905968
bf9f9274   3214905972
bf9f9278   3214905976


如果想理解多維數組的內存圖,可以看看下面這張圖片:



最後看得有點頭暈,記住這兩個結論:

*(*(zippo+m)+n)=zippo[m][n]
對N維的數組取值時要用到N個*。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章