二维数组中的一些问题
一:二維數組怎么才能正確的初始化
arr[3][4] = {1, 2, 3}; arr[3][4] = {{1, 2}, 3}; arr[3][4] = {{1}, {2}, {3}};這些顯然是正常的初始化一個二維數組。
下面這些,看看對不對:
arr[][4] = {{1}, {2}, {3}}; arr[3][] = {{1}, {2}, {3}};第一個對,第二個錯。為什么呢? ??
? ? ? ?行可以省略,但是列不能省略。(原因往下看哦)
二:二維數組在內存中如何存儲
以arr[3][4]為例,我們來看看
for (i = 0; i < 3; i++){for (j = 0; j < 4; j++){printf("&arr[%d][%d]=%p\n", i, j, &arr[i][j]);}}它的打印結果如下圖,可見它是連續存放的,每個差4個字節。
在我們的假象中,二維數組可能有多行多列,如下圖。
存儲時,肯定是第一行存完存第二行,第二行存完第三行。那么如果不知道一行有幾個元素,第二行怎么存儲呢。所以上面提到的為什么行可以省略,而列不能省略也就解答了。
?
三:二維數組的指針訪問
以arr[3][4]為例
int i = 0, j = 0;int arr[3][4] = { 0 };int *p = arr;for (i = 0; i < sizeof(arr) / sizeof(arr[0][0]); i++){*(p + i) = i + 1;}for (i = 0; i < 3; i++){for (j = 0; j < 4; j++){printf("%d ", arr[i][j]);}printf("\n");}int *p = arr;for (i = 0; i < sizeof(arr) / sizeof(arr[0][0]); i++){*(p + i) = i + 1;}for (i = 0; i < 3; i++){for (j = 0; j < 4; j++){printf("%d ", arr[i][j]);}printf("\n");}這樣對嗎?我們發現在編譯過程中報了一個警告: ? ? ? C4047“初始化”:“int *”與“int (*)[4]”的間接級別不同。
?
int *p的類型是int*,而arr的類型是int (*)[4],所以這是不能賦值的。
應該寫成 ?int *p = &arr[0][0]
深入來看看:
?
? ? ? ?arr表示整個數組有兩種情況:sizeof(arr) 和 &arr?,其他的表示首元素地址。上面這段代碼中只有arr,所以它也表示首元素地址。但我們不知道二維數組中哪一個是它的首元素,是第一行的第一個呢,還是第二行的第一個?以arr[3][4]為例,我們把它想象成一個一維數組,它有三個元素,每個元素中都包含四個元素。所以arr表示三個元素中第一個元素的地址,也就是一個一維數組的地址,所以上面代碼中arr的類型為int (*)[4](指針指向了一個數組)。
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的二维数组中的一些问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言小游戏——三子棋
- 下一篇: 有关数组的运算 (sizeof)(str