<address id="ousso"></address>
<form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
  1. C語言

    C語言指針與二維數組資料詳解(附示例代碼)

    時間:2025-04-15 15:13:37 C語言 我要投稿
    • 相關推薦

    C語言指針與二維數組資料詳解(附示例代碼)

      二維數組在概念上是二維的,有行和列,但在內存中所有的數組元素都是連續排列的,它們之間沒有“縫隙”。本文是百分網小編搜索整理的關于C語言指針與二維數組資料詳解(附示例代碼),供參考學習,感興趣的小伙伴們可以參考一下!想了解更多相關信息請持續關注我們應屆畢業生考試網!

    C語言指針與二維數組資料詳解(附示例代碼)

      以下面的二維數組 a 為例:

      int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} };

      從概念上理解,a 的分布像一個矩陣:

      0 1 2 3

      4 5 6 7

      8 9 10 11

      但在內存中,a 的分布是一維線性的,整個數組占用一塊連續的內存:

      C語言中的二維數組是按行排列的,也就是先存放 a[0] 行,再存放 a[1] 行,最后存放 a[2] 行;每行中的 4 個元素也是依次存放。數組 a 為 int 類型,每個元素占用 4 個字節,整個數組共占用 4×(3×4) = 48 個字節。

      C語言允許把一個二維數組分解成多個一維數組來處理。對于數組 a,它可以分解成三個一維數組,即 a[0]、a[1]、a[2]。每一個一維數組又包含了 4 個元素,例如 a[0] 包含 a[0][0]、a[0][1]、a[0][2]、a[0][3]。

      假設數組 a 中第 0 個元素的地址為 1000,那么每個一維數組的首地址如下圖所示:

      為了更好的理解指針和二維數組的關系,我們先來定義一個指向 a 的指針變量 p:

      int (*p)[4] = a;

      括號中的*表明 p 是一個指針,它指向一個數組,數組的類型為int [4],這正是 a 所包含的每個一維數組的類型。

      [ ]的優先級高于*,( )是必須要加的,如果赤裸裸地寫作int *p[4],那么應該理解為int *(p[4]),p 就成了一個指針數組,而不是二維數組指針,這在《C語言指針數組》中已經講到。

      對指針進行加法(減法)運算時,它前進(后退)的步長與它指向的數據類型有關,p 指向的數據類型是int [4],那么p+1就前進 4×4 = 16 個字節,p-1就后退 16 個字節,這正好是數組 a 所包含的每個一維數組的長度。也就是說,p+1會使得指針指向二維數組的下一行,p-1會使得指針指向數組的上一行。

      數組名 a 在表達式中也會被轉換為和 p 等價的指針!

      下面我們就來探索一下如何使用指針 p 來訪問二維數組中的每個元素。按照上面的定義:

      1) p指向數組 a 的開頭,也即第 0 行;p+1前進一行,指向第 1 行。

      2) *(p+1)表示取地址上的數據,也就是整個第 1 行數據。注意是一行數據,是多個數據,不是第 1 行中的第 0 個元素,下面的運行結果有力地證明了這一點:

      #include <stdio.h>

      int main(){

      int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} };

      int (*p)[4] = a;

      printf("%d ", sizeof(*(p+1)));

      return 0;

      }

      運行結果:

      16

      3) *(p+1)+1表示第 1 行第 1 個元素的地址。如何理解呢?

      *(p+1)單獨使用時表示的是第 1 行數據,放在表達式中會被轉換為第 1 行數據的首地址,也就是第 1 行第 0 個元素的地址,因為使用整行數據沒有實際的含義,編譯器遇到這種情況都會轉換為指向該行第 0 個元素的指針;就像一維數組的名字,在定義時或者和 sizeof、& 一起使用時才表示整個數組,出現在表達式中就會被轉換為指向數組第 0 個元素的指針。

      4) *(*(p+1)+1)表示第 1 行第 1 個元素的值。很明顯,增加一個 * 表示取地址上的數據。

      根據上面的結論,可以很容易推出以下的等價關系:

      a+i == p+i

      a[i] == p[i] == *(a+i) == *(p+i)

      a[i][j] == p[i][j] == *(a[i]+j) == *(p[i]+j) == *(*(a+i)+j) == *(*(p+i)+j)

      【實例】使用指針遍歷二維數組。

      #include <stdio.h>

      int main(){

      int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};

      int(*p)[4];

      int i,j;

      p=a;

      for(i=0; i<3; i++){

      for(j=0; j<4; j++) printf("%2d ",*(*(p+i)+j));

      printf(" ");

      }

      return 0;

      }

      運行結果:

      0   1   2   3

      4   5   6   7

      8   9  10  11

      指針數組和二維數組指針的區別

      指針數組和二維數組指針在定義時非常相似,只是括號的位置不同:

      int *(p1[5]);  //指針數組,可以去掉括號直接寫作 int *p1[5];

      int (*p2)[5];  //二維數組指針,不能去掉括號

      指針數組和二維數組指針有著本質上的區別:指針數組是一個數組,只是每個元素保存的都是指針,以上面的 p1 為例,在32位環境下它占用 4×5 = 20 個字節的內存。二維數組指針是一個指針,它指向一個二維數組,以上面的 p2 為例,它占用 4 個字節的內存。


    【C語言指針與二維數組資料詳解(附示例代碼)】相關文章:

    C語言數組與指針詳解08-15

    C語言中指針與數組的詳解及區別09-07

    c語言知識:數組指針和指針數組的區別07-27

    c語言指針中的二級指針示例詳解11-07

    C語言指針數組的概念07-19

    如何使用C語言數組指針09-14

    C語言-15:多維數組與指針07-25

    C語言二維數組08-16

    C語言指針用法詳解08-21

    <address id="ousso"></address>
    <form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
    1. 日日做夜狠狠爱欧美黑人