大多數初學者不是很清楚二維數組是個怎樣的存在,今天我就來說說這個二維數組,計算機內存是一連串的存儲單元,我們可以把它理解成一條線,沒錯就是一條線,那么問題來了,二維是個怎樣的存在呢???說白了,二維數組並不真是二維,只是人們主觀的將它變成二維,舉個例子吧!比如樓梯,我們都知道樓梯說白了就是一條路,但是我們刻意將樓梯來回上升的方式,這都是我們主觀的改變,實際上我們可以看成是一個直路,只是被工人弄彎了。好了,不扯了,進入主題。。。。
二維數組名a是數組第一行的指針,它指向的是一整行,*a才是a[0][0]的地址,數組名a是一整行地址,*a是一個元素的地址,但此時p=a,這個p卻是a[0][0]的地址看下面的程序
1 #include<stdio.h> 2 3 int main() 4 { 5 int a[2][3]={1,2,3,4,5,6},*p; 6 7 p=a; 8 9 printf("%d %d %d\n",p,a,*a); 10 11 return 0; 12 }
結果顯示
第一行的地址和第一個元素首地址肯定相同,我們繼續看
1 #include<stdio.h> 2 3 int main() 4 { 5 int a[2][3]={1,2,3,4,5,6},*p; 6 7 p=a; 8 9 printf("%d %d\n",(p+1),*(a+1)); 10 11 return 0; 12 }
結果顯示,可以看出,地址差異出來了,第0行的地址為6487600,所以a[0][1]就是6487604,而第一行的地址為6487612,第0行和第1行是不是相差了3個int型字節,所以這就證明了a是數組第一行的指針,它指向的是一整行,p指向的是一個元素
繼續證明
1 #include<stdio.h> 2 3 int main() 4 { 5 int a[2][3]={1,2,3,4,5,6},*p; 6 7 p=a; 8 9 printf("%d %d\n",*(p+1),**(a+1)); 10 11 return 0; 12 }
結果
結論:**a才表示a[0][0],*a表示a[0][0]的地址,a表示第一行的地址