為什麼這段代碼的執行結果是這樣?
int (*a)[2];
int b[2][2];
printf("size of first element of b is %d\n",sizeof(b[0][0])) ;
a = b;
printf("size of first element of a is %d",sizeof(a[0][0])) ;
size of first element of b is 4
size of first element of a is 40
二維數組在內存中其實是一個平坦的一維數組,下面具體說明:
int arr[3][5] 和 int arr[15] 所使用的內存區大小是一樣的,都是15*sizeof(int)個字節。
如果你做下面這樣一個定義:
union{
int a[3][5];
int b[15];
}U;
你會發現
U.a = &U.b
U.a[0] == &U.b[0]
U.a[1] == &U.b[5]
U.a[2] == &U.b[10]
&U.a[2][3] == &U.b[13]
規律是: &U.a[m][n] == &U.b[m*5+n],其中5就是數組a的第二維度。
實際上,二維數組在運行時也是用這樣的公式轉化為對一維數組的訪問。