簡體   English   中英

指針算術和解除引用

[英]Pointer arithmetic and dereferencing

在下面的代碼中,任何人都可以向我解釋粗體行正在做什么。

struct southParkRec {
    int stan[4];
    int *kyle[4];
    int **kenny;
    string cartman;
};

int main()
{
    southParkRec cartoon;
    cartoon.stan[1] = 4;
    cartoon.kyle[0] = cartoon.stan + 1;
    cartoon.kenny = &cartoon.kyle[2];
    *(cartoon.kenny + 1) = cartoon.stan;  //What does this line do?

    return 0;
}

把它想象成

cartoon.kenny[1] = cartoon.stan;

它們基本上是一回事

如果我們將整個事物帶到一個使用下標運算符[] (可能帶有& )而不是*+組合的常見樣式,它將如下所示

cartoon.stan[1] = 4;
cartoon.kyle[0] = &cartoon.stan[1];
cartoon.kenny = &cartoon.kyle[2];
cartoon.kenny[1] = &cartoon.stan[0];

之后

cartoon.kenny = &cartoon.kyle[2];

你可以把kenny想象成嵌入kyle數組的int *元素的“數組”,帶有2個元素的偏移: kenny[0]相當於kyle[2]kenny[1]相當於kyle[3]kenny[2]相當於kyle[4]等。

所以,當我們做的時候

cartoon.kenny[1] = &cartoon.stan[0];

它等同於做

cartoon.kyle[3] = &cartoon.stan[0];

這基本上就是最后一行的作用。

換句話說,如果我們從考慮中消除kenny (“殺死Kenny”),假設代碼的其余部分(如果有的話)不依賴於它,那么整個代碼將等同於

cartoon.stan[1] = 4;
cartoon.kyle[0] = &cartoon.stan[1];
cartoon.kyle[3] = &cartoon.stan[0];

至於這一切的重點......我不知道。

在卡通中你有:
- stan,4個整數的數組。
- kyle,一個4個指向int的數組。
- kenny,一個指向int的指針,也就是說,指向一個“int of int”的指針。

cartoon.stan[1] = 4; 將stan數組的第二個元素(一個int)設置為1。
cartoon.kyle[0] = cartoon.stan + 1; 設置kyle數組的第一個元素(指向int的指針)指向stan數組的第二個元素(我們剛剛設置為4)。
cartoon.kenny = &cartoon.kyle[2]; 將kenny指針設置為指向kyle數組的第三個元素。
*(cartoon.kenny + 1) = cartoon.stan; 將kyle數組的第四個元素(指向int的指針)設置為指向stan數組的第一個元素(尚未初始化)。 更詳細:

cartoon.kenny獲取kenny指針的地址(kyle數組的第三個元素),
cartoon.kenny+1獲取該地址后的下一個int(kyle數組的第四個元素,恰好是指向int的指針),
*(cartoon.kenny + 1)取消引用指針,所以我們可以設置它,和
= cartoon.stan將其設置為指向stan數組的第一個元素。

它正在將指針遞增到* cartoon.kenny。 'kenny'是指向指針的指針,因此第一個取消引用返回一個指針,該指針遞增,並指定一個值。 所以,*(kenny + 1)現在指向數組'stan'的開頭。

它將Kyle的最后一個元素設置為指向Stan的第一個元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM