我需要帮助理解我们如何获得下表中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 */
答案 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)。
然后x
将p
的地址处的值修改为11(通过x
),因此loc3的{{1}}值变为11。
答案 1 :(得分:1)
位置1:
int x = 42;
int y = 13;
int *p;
int **p2;
p
或p2
并不指向任何地方。
位置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
。
无法更改y
或p2
。
位置4:
*p = 12;
取消引用p
以获取x
并向其提供12。没有更改为y
或p2
或p
。
答案 2 :(得分:0)
当您开始时,p
和p2
未初始化且包含不确定的值,因此在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
,所以现在我们已经1} 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