1. 程式人生 > >C語言二級陣列和二級指標

C語言二級陣列和二級指標

轉載部落格:https://www.cnblogs.com/zou107/p/4909847.html

 

一、關於二維陣列和二維陣列區別

(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)二維陣列和陣列指標兩者是有緊密的關係的。學會使用陣列指標來操作二維陣列,重在實踐操作使用就會加深理解。