2014-12-05 17 views
2

我正在看一篇我在大学里学习的课程的过去论文,而且总是有关于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

我超级困惑,看到:

  1. x的值没有声明,所以我还以为这将是无法评估x+2
  2. y不是一个数组,那么如何评估y[1]

为什么7这里是正确答案?

+4

*(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

+0

击败我。好的解释@jcjunction! – 2014-12-05 17:59:58

回答

0

允许它分解:

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点,并添加一个整数的大小并获得它现在指向的内容。

2

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指向。

1

注意事项:

  • *(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; 

所以,现在,让我们来看看这个问题:现在

  1. x[2]用的x[3] + 1
  2. 所以x[2]的值更新为7
  3. 所以x == {0, 2, 7, 6}
  4. ÿ仍然分价值为x + 2
  5. 所以*y == 7
0

让我们考虑代码一步一步来。

指针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。

0

这里的关键组件是索引操作符返回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* 

我添加了一个表在这里希望能帮助澄清: tabel