需要帮助来理解涉及指针的C练习的解决方案

时间:2014-10-30 14:37:46

标签: c

我需要帮助理解我们如何获得下表中Loc3和Loc4的值。   当我自己制作一张桌子时,我到达了那些列的完全不同的条目。   谢谢!

int x = 42; /* x is at address 100 */
int y = 13; /* y is at address 104 */
int *p; /* p is at address 108 */
int **p2; /* p2 is at address 112 */
/* Location 1 */
p = &y;
p2 = &p;
/* Location 2 */
*p2 = &x;
**p2 = 11;
/* Location 3 */
*p = 12;
/* Location 4 */

enter image description here

3 个答案:

答案 0 :(得分:3)

例如,loc3中的x变为11,因为您将**p2设置为11,这会修改该内存位置的值。 (双星是指向指针的指针)。 Ampersand得到了地址。

详细说明:

*p2 = &x;
**p2 = 11;

在Loc2中,您设置了p2 = &p,这意味着p2现在指向p的地址,即108.

但是现在在Loc3中,您可以将p2指向的地址设置为x的地址。换句话说,由于p2指向p的地址,现在您要说p应该指向x的地址(这是p也为什么**p2变为100)。

然后xp的地址处的值修改为11(通过x),因此loc3的{{1}}值变为11。

答案 1 :(得分:1)

位置1:

int x = 42;
int y = 13;
int *p;
int **p2;

pp2并不指向任何地方。

位置2:

p = &y;

p指向y

p2 = &p;

p2指向p

x或y无变化。

位置3:

*p2 = &x;

由于p2指向p,解除引用p2并为其分配值会将p更改为指向x。与执行p = &x相同。

**p2 = 11;

取消引用一次到达p,再次取消引用以转到x,并为其分配11。与执行相同:x = 11*p == 11

无法更改yp2

位置4:

*p = 12;

取消引用p以获取x并向其提供12。没有更改为yp2p

答案 2 :(得分:0)

当您开始时,pp2未初始化且包含不确定的值,因此在Loc 1下的两个条目中都为??

p = &y;

y(104)的位置分配给p

p2 = &p;

p(108)的位置指定给p2。请注意,表达式 &p的类型为char **,与变量 p2的类型相匹配。所以在这两个陈述之后,所有以下都是正确的:

  p2 == &p       == 108  // all expressions have type char **
 *p2 ==  p == &y == 104  // all expressions have type char *
**p2 == *p ==  y == 13   // all expressions have type char
               x == 42

接下来我们执行

*p2 = &x;

从上面我们可以看到*p2相当于p,因此此语句将x(100)的地址分配给p,所以现在我们已经

  p2 == &p       == 108
 *p2 ==  p == &x == 100       
**p2 == *p ==  x == 42
               y == 13

接下来我们执行

**p2 = 11;

**p2相当于*p,相当于x,因此我们最终将值11分配给x

  p2 == &p        == 108
 *p2 ==  p == &x  == 100
**p2 == *p ==  x  == 11
               y  == 13

最后我们有

*p = 12;

*p相当于x,因此我们将值12分配给x,让我们留下:

  p2 == &p        == 108
 *p2 ==  p == &x  == 100
**p2 == *p ==  x  == 12
               y  == 13