有關二維陣列的指標問題

2021-10-10 17:44:31 字數 2860 閱讀 1750

建立在以下資料上的思考

[二維陣列]在概念上是二維的,有行和列,但在記憶體中所有的陣列元素都是連續排列的,它們之間沒有「縫隙」。以下面的二維陣列 a 為例:

int a[3][4] = , ,  };
在概念上儲存的過程:01

231011

1213

2021

2223

在記憶體中儲存的過程:01

231011

1213

2021

2223

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 為 int 型別,每個元素占用 4 個位元組)

二維陣列的位址

a=a[0][0]=a[0] 

a+1=a[1]

a[0]+1=a[0][1]

指向由m個元素構成的一維陣列的指標變數

這種指標使得p+1不是指向a[0][1],而是指向a[1],p的增值以一維度陣列的長度為單位,這種指標稱為行指標。

int (*p)[4] = a;
括號中的*表明 p 是乙個指標,它指向乙個陣列,陣列的型別為int [4]

1.1p指向陣列 a 的開頭,也即第 0 行;p+1前進一行,指向第 1 行。

​ 對指標進行加法(減法)運算時,它前進(後退)的步長與它指向的資料型別有關,p 指向的資料型別是int [4],那麼p+1就前進 4×4 = 16 個位元組,p-1就後退 16 個位元組,這正好是陣列 a 所包含的每個一維陣列的長度。也就是說,p+1會使得指標指向二維陣列的下一行,p-1會使得指標指向陣列的上一行。

1.2*(p+1)表示取位址上的資料,也就是整個第 1 行資料。

​ 注意是一行資料,是多個資料,不是第 1 行中的第 0 個元素。

1.3*(p+1)+1表示第 1 行第 1 個元素的位址。

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

1.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)第i行第j列的值

指向陣列中的首元素位址。

int *p=a[0];
括號中的*表明 p 是乙個指標,它指向陣列中首元素的位址,乙個int型別的資料元素。

2.1*p=a[i]指向陣列第i行第0個資料。

*p=a[1]會使得指標指向二維陣列的第一行首元素,*p=a[2]會使得指標指向陣列的第二行首元素。p在這裡儲存的是第i行首元素。

​ 對指標進行加法(減法)運算時,它前進(後退)的步長與它指向的資料型別有關,p 指向的資料型別是int,那麼p+1就前進 4個位元組,p-1就後退 4 個位元組。*(p+1)相當於a[0][1]。在二維陣列當中,資料在記憶體位址上儲存是連續排列的。*(p+i)相當於前進4*i個位元組取從*p往後數第i位元素的位址。例如*(p+6)取得的資料為a[1][2]的值12

通過上述推論,可以得到這個等式

a[i][j] == p[j] == *(p+j)
​ 在二維陣列當中,aa[0]都表示二維陣列中首元素位址。

a是二維陣列的名字,指向所屬元素首元素,其中每乙個元素為乙個行陣列,因此指標的移動單位為「行」。

a[0]是一維陣列的名字,指向所屬元素首元素,其中每乙個元素為乙個int型別的資料,因此指標的移動單位為「列(單個資料元素)」。

二維陣列指標問題

編寫乙個程式,初始化乙個double型別的3 5二維陣列,使用乙個處理變長陣列的函式將其拷貝至另乙個二維陣列中。還要編寫乙個以變長陣列為形參的函式以顯示兩個陣列的內容。這兩個函式應該能處理任意n m陣列。c primer 10 6 程式設計練習 如下 void copy2d int row int ...

二維陣列的指標問題

最近遇到一道題,題目是這樣的 int x 6 4 p 4 p x 則 p 2 指向 a.x 0 1 b.x 0 2 c.x 1 0 d.x 2 0 先給出正確答案是d.然後我想上機驗證一下,如下 int main int p 2 b p x b p 1 return 0 不過b p 1 這句報錯,後...

二維陣列 二維陣列和指標

include using namespace std int main 如上面這段程式所示,通過取位址符 指標 p 獲得了變數 a 的位址,那麼解引用符 就可以從 p 中得到變數 a 的值。也就是說,p a和 p a是等價的。p 是變數 a 的位址,從 p 中就可以取出 a 的值。反之,能從 p ...