C語言再學習20 指標 陣列(五)

2021-09-28 15:39:50 字數 2747 閱讀 4205

1.1 二維陣列

除了函式,陣列裡可以存放任何資料。

char a[3]

[4];

a[1][2] 如下圖:

實際上,記憶體是線性的,類似於尺子,最小單位為 byte 。比如:記憶體位址 0x0000ff00 是指記憶體零位址開始偏移 0x0000ff00 個 byte。實際上二維陣列記憶體的存放如下圖:

註解:(1)a[3] 這個一維陣列的三個元素分別是:a[0],a[1],a[2] 。

(2)每個元素的大小為 sizeof(a[0]),即 sizeof(char) * 4。因此可以計算出 a[0],a[1],a[2] 三個元素的首位址依次為:&a[0],&a[0] + 1 * sizeof(char) * 4,&a[0] +2 * sizeof(char) * 4。也是 a[i] 的首位址為:&a[0] + i * sizeof(char) * 4。

(3)此處,a[i] 內有 4 個 char 型別的元素,每個元素的首位址為:&a[i],&a[i] + 1 * sizeof(char),&a[i] + 2 * sizeof(char),&a[i] + 3 * sizeof(char),即 a[i][j] 的首位址為:&a[i] + j * sizeof(char)。

(4)再把 &a[i] 的值用 a 表示,得到 a[i][j] 元素的首位址為:a + i * sizeof(char) * 4 + j * sizeof(char)。同樣換為指標的形式為:((a + i) + j)。

1.2 二維陣列的初始化

示例:

#include

intmain

(void);

int arr2[3]

[2]=

,,};

int*p1,

*p2;

p1 = arr1[0]

; p2 = arr2[0]

;printf

("p1 ---> %d \r\n"

, p1[0]

);printf

("p2 ---> %d \r\n"

, p2[0]

);getchar()

;return0;

}

結果輸出:

測試可知,p1[0] 的結果為 2,p2[0] 的結果為 1。這是為什麼呢?哪個才是正確的二維陣列初始化呢?答案是明顯的,p2 是正確的二維陣列初始化,那 p1 是怎麼回事呢?其實區別就在於 () & {} 的區別,因為 () 號中使用 「,」 隔開,實質是先進行了 「,」 號運算,這樣 int arr1[3][2] 的結果就變成了了:,所以 p1[0] 的結果是 2。故我們在進行二維陣列初始化的時候,要注意 () & {} 的區別。

1.3 乙個例子

void

array_addrtest

(void

)

執行結果:

&a[4][2]:&a[0][0] + 4 * 5 * sizeof(int) + 2 * sizeof(int)

p[4][2]:p 是指向乙個包含 4 個元素陣列的指標。也即 p + 1 表示的是指標 p 向後移動了乙個 「包含 4 個 int 型別元素的陣列」。這裡的 「1」 是 p s所指向的空間,即 4 * sizeof(int)。故 p[4] 是相對於 p[0] 向後移動了 4 個 「 包含 4 個 int 型別元素的陣列」。

綜上,&p[4][2] - &a[4][2] 為 4 個 int 的長度。

1.4 二級指標

char

**p;

char **p 定義了乙個二級指標變數 p。p 是乙個指標變數,在32 位系統下佔 4 個byte。它與一級指標不同的是,一級指標儲存的是資料的位址,二級指標儲存的是一級指標的位址。

指標初始化:

p =

null

;char

*p2 ;

p =&p2;

任何指標都可以被初始化為 null,注意不是nul or null。即指標指向陣列的零位址。如果把指標初始化為 null,這時指標沒有任何的記憶體可用。

如何使用二級指標 p 呢?

(1)根據 p 這個變數,取出它裡面存放的位址;

(2)找到這個位址所在的記憶體;

(3)使用運算子 * 開啟這塊記憶體,取出它裡面的位址,即 * p 的值;

(4)找到第二次取出的這個位址;

(5)再次使用運算子 * 開啟這塊記憶體,取出它裡面的內容,這就是 **p 的值。

注:對於二維指標,可以這樣理解: (char *)*p,把括號裡的當成乙個型別,這樣又等價一維指標了。

C語言再學習16 指標 陣列(一)

前言 p 乙個 int 型別的模子在記憶體上得到 4 個位元組的空間,然後把這個 4 個位元組大小的空間命名為 p,同時限定這 4 個位元組的空間裡面只能儲存某個記憶體位址,即使存入其他任何資料,都將被當作位址處理,而且這個記憶體位址開始的連續 4 個位元組上只能儲存某個 int 型別的資料。理解 ...

C語言再學習19 指標 陣列(四)

1.1 指標陣列和陣列指標的記憶體布局 指標陣列 乙個陣列,陣列元素都是指標,陣列佔多少位元組由陣列本身決定。它是 儲存指標的陣列的簡稱。陣列指標 乙個指標,它指向乙個陣列。在 32 位系統下,指標永遠佔 4 個位元組,至於它指向的陣列佔多少位元組,我們並不知道。它是 指向陣列的指標的簡稱。指標陣列...

C語言學習(五)指標

int main int i 定義整型變數 int 為指向整型資料的指標變數 inta n 定義整型陣列 它有 個元素 int 定義指標陣列 它由 個指向整型資料的指標元素組成 int p為指向含n個元素的一維陣列的指標變數 int f 為帶回整型函式值的函式 int 為帶回乙個指標的函式,該指標指...