[英]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.