C指针过去的文章
我正在看一篇我在大学里学习的课程的过去论文,而且总是有关于C指针的问题。C指针过去的文章
我想我有他们是如何工作的合理把握,然而,这是困惑我的问题是:
Consider running the C program fragment:
int x[4] = {0,2,4,6};
int *y;
y = &x[2];
*(x + 2) = y[1] + 1;
What is the value of the expression *y afterwards?
(a) 2
(b) 4
(c) 5
(d) 7
(e) 8
现在,在回答对上述问题,它说,答案是d
。
我超级困惑,看到:
- x的值没有声明,所以我还以为这将是无法评估
x+2
-
y
不是一个数组,那么如何评估y[1]
?
为什么7
这里是正确答案?
允许它分解:
INT X [4] = {0,2,4,6};
x [0] = 0
x [1] = 2
x [2] = 4
x [3] = 6
INT * Y;指针的整数所以ÿ可以指向任何位置沿x
x [0] = 0 // <-- y ?
x [1] = 2 // <-- y ?
x [2] = 4 // <-- y ?
x [3] = 6 // <-- y ?
Y = & X [2];现在,我们已指定使y点为x [2]
x [0] = 0
x [1] = 2
x [2] = 4 // <-- y (or y[0])
x [3] = 6
*(X + 2)这是相同的为x [2],从而: X [2] = Y [1] + 1;
x [0] = 0
x [1] = 2
x [2] = 4 // <-- x[2]
x [3] = 6 // <-- y[1]
Y [1]是6,所以Y [1] + 1 = 7
注意,Y [1]是相同的*(Y + 1)。我们也取地址y点,并添加一个整数的大小并获得它现在指向的内容。
x
是4元素阵列。 *x
引用该数组中的第一个元素,*(x + 2)
引用第三个元素。
*y
点在x
阵列(y = &x[2])
在索引2(第三元件)的最终分配设定原始x
阵列(*(x + 2)
)至y[1] + 1
值的第三元件。由于y
初始化为指向第3个元素,因此y[1]
将指向原始x数组的最后一个元素。
6 + 1
被分配给x
阵列的第3个元素,其中*y
指向。
注意事项:
-
*(x + 2)
是完全一样x[2]
。 -
&x[2]
与&(*(x + 2))
完全相同,与x + 2
相同。
因此,了解,让我们改写了问题:
int x[4] = {0,2,4,6};
int *y = &x[2];
*(x + 2) = y[1] + 1;
还有一些更改写:
int x[4] = {0,2,4,6};
int *y = x + 2;
x[2] = *(y + 1) + 1;
现在,让我们直接替换y
进入最后的等式:
int x[4] = {0,2,4,6};
int *y = x + 2;
x[2] = *((x + 2) + 1) + 1;
并清理它:
int x[4] = {0,2,4,6};
int *y = x + 2;
x[2] = x[3] + 1;
所以,现在,让我们来看看这个问题:现在
-
x[2]
用的x[3] + 1
- 所以
x[2]
的值更新为7 - 所以
x == {0, 2, 7, 6}
- ÿ仍然分价值为
x + 2
。 - 所以
*y == 7
让我们考虑代码一步一步来。
指针y由所述阵列的所述第三元件的地址初始化(索引从0开始)
y = &x[2];
所以ÿ点4。所以x[2]
和y[0]
是等价表达式
y[1]
被y[0]
之后的下一个元素就是6.
y[1] + 1
将等于7
*(x + 2)
与x[2]
相同所以x[2]
将被设置为7.同时y也指向 x[2]
。所以*y
将等于7。
这里的关键组件是索引操作符返回y 1一个实际的int而不是一个地址。对于解引用运算符*(x + 2)也是如此。
int a = y[1]; // a = the value of the int after y[0]
int b = *(x + 2); // b = the value of x[2] note that the index operator is just shorthand, y[1] just means *(y + 1)
// int* c = y[1]; NOT LEGAL assignment of an int to an int*
// int* d = *(x + 2); NOT LEGAL assignment of an int to an int*
我添加了一个表在这里希望能帮助澄清:
*(x + 2)和x [2]是编译器相同。 y [1]与*(y + 1)相同。由于y与x + 2的内存位置相同,(x + 2)+1指向6或x [3]。添加一个到它变成7.并且它分配给x [2],其中y指向 – jcjunction 2014-12-05 17:59:21
击败我。好的解释@jcjunction! – 2014-12-05 17:59:58