2010-06-23 121 views
4

在下面的代碼中,任何人都可以向我解釋粗體的行是在做什麼。指針算術和解引用

 
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; 
} 
+0

夥計,你從哪裏得到這段代碼? Cartman獲得「臃腫」對象的任何原因:)? – Jacob 2010-06-23 20:18:31

+0

我懷疑他在這裏得到它:http://www.stanford.edu/class/cs106x/handouts/32-Section-Handout.pdf – fadden 2010-06-23 22:35:07

回答

0

它將指針增加到* cartoon.kenny。 'kenny'是一個指向指針的指針,因此第一個解引用會返回一個指針,該指針遞增,並賦值一個值。所以,*(肯尼+ 1)現在指向數組'stan'的開始。

+0

我愛白癡投票人得到他們的答案頂部。這裏到底出了什麼問題? – 2010-06-23 22:59:17

2

認爲它是

cartoon.kenny[1] = cartoon.stan; 

它們基本上是相同的事情

1

在卡通您有:
- 斯坦,4個整數數組。
- kyle,一個4個int指針的數組。
- kenny,指向int的指針,也就是說,指向「整數數組」的指針。斯坦陣列(一個int)的爲1凱爾陣列(一個指針爲int)的
cartoon.kyle[0] = cartoon.stan + 1;組第一元件

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

cartoon.kenny得到肯尼指針的地址(凱爾陣列的第三元件),
cartoon.kenny+1
該地址(凱爾陣列,這恰好是一個指針到int的第四元件)後得到下一個INT *(cartoon.kenny + 1)解除引用指針,所以我們可以設置它,並且
= cartoon.stan將它設置爲指向stan數組的第一個元素。

2

如果我們把整個事情用下標操作[](可能與&)的一個共同的風格,而不是一個*+組合,它看起來如下

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 ele補償抵消: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從考慮(「殺肯尼」),假設代碼的其餘部分(如果有的話)不依賴於它,你的整個代碼將相當於

至於什麼是這一切......我不知道。

0

它設置凱爾的最後一個元素指向斯坦的第一個元素。