指针算术和解除引用

时间:2010-06-23 20:00:17

标签: c++

在下面的代码中,任何人都可以向我解释粗体行正在做什么。

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

5 个答案:

答案 0 :(得分:2)

将其视为

cartoon.kenny[1] = cartoon.stan;

它们基本上是一回事

答案 1 :(得分: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视为嵌入int *数组的kyle元素的“数组”,其中包含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];

至于所有这些的重点......我不知道。

答案 2 :(得分:1)

在卡通片中你有:
- stan,4个整数阵列 - 凯尔,一个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数组的第一个元素。

答案 3 :(得分:0)

它将指针递增到* cartoon.kenny。 'kenny'是指向指针的指针,因此第一个取消引用返回一个指针,该指针递增,并指定一个值。所以,*(kenny + 1)现在指向数组'stan'的开头。

答案 4 :(得分:0)

它将Kyle的最后一个元素设置为指向Stan的第一个元素。