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\n", 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("\n"); } 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說話 指針和二維數組的材料整頓,後續持續彌補相干常識,感謝年夜家對本站的支撐!