陣列指標解析

2021-07-05 11:28:00 字數 1476 閱讀 2671

題目:

最近看到一道模擬題,題目如下:

#include#include#include#include#includeusing namespace std;

int main();

int(*p)[3];

p = n;

cout << p[0][0] << "," << *(p[0] + 1) << "," << (*p)[2] << endl;

cout << (*p)[3] << endl;

cout << (*p + 1)[1] << endl;

return 0;

}

先思考一下,然後斷點設定後結果如下:

分析:

首先,我們來看這一句:

int n[3] = ;
它代表的是下圖,子陣列是長度為3的陣列,如下圖:(其中黑色的部分)

int(*p)[3];

p = n;

表示p是乙個指標,並且指向3個int元素的陣列,在這裡它指向了n所表示的陣列。

那麼(*p)就是指向了n[0]所代表的三個元素,即上圖中藍色部分

*(p + 1)中,表示指向下乙個位置(下乙個三個陣列)所對應的值,即上圖中綠色部分

(*p + 1)或(*p) + 1意義一樣(因為*的優先順序》加號的優先順序),表示(*p)的下乙個元素,即指向20的指標,注意這裡不是20,圖中橙色部分。

注意對p加1和對(*p)加1的不同!其中加的是三個int大小,後者因為已經解引用過了,加的乙個int大小。

逐個來分析:

(*p)對應的是指向的指標

*(p + 1)對應的是指向的指標

(*p + 1)對應的是指向20的指標

*(p[1] + 1)中p[1]就相當於*(p + 1),指向了,再加1表示加乙個int大小,最後解引用了,所以對應50。

p[0][0]不用說,對應10。

*(p[0] + 1),p[0]對應於(*p),是指向的指標,再加1表示加乙個int大小,最後解引用了,所以對應20。

(*p)[2]中(*p)表示指向的指標,再對其[2],就是對應30。

(*p)[4]中4越界了,那麼跳到了第二行,對應的是50。

(*p + 1)[1]中(*p + 1)對應指向20的指標,對其[1]相當於向後乙個int的位置並解引用,相當於*((*p + 1) + 1),所以對應30。(x[1]相當於是*(x + 1))

ok,敘述完畢,多謝小雙蒞臨指導。

——apie陳小旭

指標陣列與陣列指標 go解析

對於指標陣列和陣列指標在c或c 中也經常被討論,尤其對於初學者來說會分辨不清楚。其實在每個詞中間新增乙個 的 就很好理解了,指標的陣列,陣列的指標。本文就通過go語言來分別解釋一下陣列指標與指標陣列。對於指標陣列來說,就是 乙個陣列裡面裝的都是指標,在go語言中陣列預設是值傳遞的,所以如果我們在函式...

二重指標指向指標陣列解析

typedef int init fnc t void 定義函式型別 init fnc t init fnc ptr 二重函式指標 init fnc t init sequence for init fnc ptr init sequence init fnc ptr init fnc ptr 函式...

指向陣列的指標的解析

指向陣列的指標的解析 定義乙個指標,這個指標指向乙個陣列,陣列中只有4個byte元素 typedef byte bytarr 4 byte arr 4 定義乙個陣列 bytarr byt arr 將指標指向陣列 for int i 0 i 4 i 利用乙個陣列指標列印乙個整型數的內容 int n 1...