一、關於二維數組和二維數組區別
(1)一維數組在內存中是連續分布存儲的,同樣,二維數組也是在內存連續存儲的。所以從內存的角度來分析,一維數組和二維數組其實沒有本質區別。
(2) 二維數組可以使用一維數組來代替。但是在實際的應用中,有時候使用二維數組會更加直觀,方便程序的編程。
(3)兩者在內存使用效率上是一模一樣的。
二、二維數組的第一維和第二維概念
(1)例如 int a[2][5]中,前面的2表示第一維;後面的5表示第二維
(2) 二維數組的第一維表示最外部的那一層,第一維本身也是一個數組,裡面存放了2個元素,這兩個元素就分別是第二維的數組。第二維數組本身也是一個數組,裡面存放的元素是普通的int型變量。
三、二維數組的下標訪問
例1:
1 int a[2][5] = {{1,2,3,4,5},{6,7,8,9,10}}; 2 int (*p)[5]; // 定義一個數組指針 3 p = a; 4 5 printf(" a[1][2] = %d.\n", a[1][2]); // a[1][2] = 8 6 printf("(*(p+1)+1) = %d.\n", *(*(p+1)+2)); // a[1][2]
運行結果:
四、關於二維數據必須要明白的幾個符號
例2:理解 a 、&a、 a[0]、 &a[0]、 a[0][0]、 &a[0][0]
1 /* 2 二維數組的幾個符號的測試 3 1、a等同於&a[0] 4 2、a[0]等同於&a[0][0] 5 3、在數值上 a、&a、a[0]、&a[0]、&a[0][0] 是相等的,但是在類型上面是有區別的。 6 */ 7 int a[2][5] = {{1,2,3,4,5},{6,7,8,9,10}}; 8 9 printf("a = %p.\n", a); // a 類型是 int (*)[5] 10 printf("&a = %p.\n", &a); // &a 類型是 int (*)[2][5] 11 printf("a[0] = %p.\n", a[0]); // a[0] 類型是 int * 12 printf("&a[0] = %p.\n", &a[0]); // &a[0] 類型是 int (*)[5] 13 printf("a[0][0] = %d.\n", a[0][0]); // a[0][0] 類型是 int 14 printf("&a[0][0] = %p.\n", &a[0][0]); // &a[0][0]類型是 int *
運行結果:
例3:第一維和第二維的數組指針的使用
1 // 二維數組與指針的結合使用 2 int a[2][5] = {{1,2,3,4,5},{6,7,8,9,10}}; 3 4 int (*p1)[5]; // 數組指針 5 int *p2; // 一般指針 6 p1 = a; // 等同 p1 = &a[0]; // 指向二維數組的數組名 7 p2 = a[0]; // 等同 p2 = &a[0][0]; // 指向二維數組的第一維數組 8 9 printf("a[0][2] = %d.\n", *(*(p1+0)+2)); // a[0][2] = 3 10 printf("a[1][2] = %d.\n", *(*(p1+1)+2)); // a[1][2] = 8 11 12 printf("a[0][2] = %d.\n", *(p2+2)); // a[0][2] = 3 13 printf("a[0][4] = %d.\n", *(p2+4)); // a[0][4] = 5
運行結果:
五、總結
(1)需要理解二維數組的實質和幾個符號的含義。
(2)二維數組和數組指針兩者是有緊密的關系的。學會使用數組指針來操作二維數組,重在實踐操作使用就會加深理解。
注:學習筆記部分是在朱有鵬老師物聯網視頻教程中摘取,特此聲明。