題目:
最近看到一道模擬題,題目如下:
#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...