在下面的代码中,任何人都可以向我解释粗体行正在做什么。
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 :(得分: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的第一个元素。