二維數組

二維數組與二級指針數組

二維數組:數組的數組spa

    二維數組的初始化3d

    

int a[3][2]={(1,2),(3,4),(5,6)};
printf("a[0][0]=%d\n",a[0][0]);

不少人以爲很簡單,很快告訴我答案是1,不過很惋惜錯了,答案是2,認真看,花括號裏面嵌套的是小括號不是花括號,因此就至關於int a[3][2]={2,4,6};指針


 

    二維數組在內存中的儲存方式code

    int a[3][4]blog

   

    二維數組的地址內存

    &a、&a[0]、a、*aclass

    

int a[2][3]={1,2,3,4,5,6};
printf("a_size=%d\n",sizeof(a));
printf("a[0]_size=%d\n",sizeof(a[0]));
printf("a[0][0]_size=%d\n",sizeof(a[0][0]));
printf("&a=%p\n",&a);
printf("&a+1=%p\n",&a+1);
printf("&a[0]=%p\n",&a[0]);
printf("&a[0]+1=%p\n",&a[0]+1);
printf("a=%p\n",a);
printf("a+1=%p\n",a+1);
printf("&a[0][0]=%p\n",&a[0][0]);
printf("&a[0][0]+1=%p\n",&a[0][0]+1);

  &a、&a[0]、a、&a[0][0]它們的數值上是相等,可是表示的意義各不相同 引用

  &a:整個二維數組的首地址,&a+1,加的是sizeof(a)個字節。im

  &a[0]:二維數組中大數組的首地址,何爲大數組,就是a[0]、a[1],因此&a[0]+1,加的是sizeof(a[0])個字節。

  a:本來覺得a是二維數組首元素的首地址,可是錯了,它也表示的是二維數組中大數組的首地址,因此a+1,也是加了sizeof(a[0])個字節,把二維數組看成一維數組,只是一維數組中的元素也是一個數組,這樣在二維數組中a表示二維數組中大數組的首地址就好理解了。

  &a[0][0]:二維數組中首元素的地址,&a[0][0]+1,加的是sizeof(a[0][0])個字節。

  


 

 

    經過指針操做二維數組

   

int a[2][3]={1,2,3,4,5,6};
int *p=a[0];
//int *p=a; int *p=&a;   報警告,數組名至關於二級指針,p爲一級指針。
printf("a[0][0]=%d\n",*p);
printf("a[0][1]=%d\n",*(p+1));
printf("a[1][0]=%d\n",*(p+3));

   經過數組名來操做數組

  int a[2][3];

  &a[0]表明的是二維數組大數組的首地址,若是我要打印a[i][j],則我先要找到a[i]的首地址,&a[i]=&a[0]+sizeof(a[0])*i,既&a[i]=&a[0]+sizeof(int)*3*i,找到了a[i]的首地址,再來考慮a[i]中的內容,a[i][j]的地址爲:&a[i]+sizeof(int)*j,既&a[i][j]=&a[0]+sizeof(int)*3*i+sizeof(int)*j;換算爲指針形式表示爲*(*(a+i)+j)

  

int a[2][3]={1,2,3,4,5,6};
printf("a[0][0]=%d\n",**a);
printf("a[1][1]=%d\n",*(*(a+1)+1));

這時想到一個問題,上面代碼中的*a與*(a+1),表明什麼意思?

int a[2][3]={1,2,3,4,5,6};
printf("&a[0]=%p\n",&a[0]);
printf("a=%p\n",a);
printf("*a=%p\n",*a);
printf("&a[1][0]=%p\n",&a[1][0]);
printf("*(a+1)=%p\n",*(a+1));

經過查閱資料,發現雖然a與*a的值同樣。可是它們的意義不一樣,a 是數組地址,類型爲int (*)[3],*a是元素地址,類型爲int *,a比*a多一級解除引用。

相關文章
相關標籤/搜索