2010-06-23 71 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

它设置凯尔的最后一个元素指向斯坦的第一个元素。