这是我的简单练习:
int a = 10;
int b = 5;
int *p = &a;
int **p2 = &p;
int *p3 = &b;
*p = **p2 + *p3;
*p3 = (**p2)--;
*p2 = p3;
**p2 = **p2 + 15;
答案密钥表示a
的值为14,b
的值为30.怎么样?我非常坚持指针**p2
,我需要对这个指针做一些解释。
答案 0 :(得分:3)
int a = 10;
int b = 5;
int *p = &a;
int **p2 = &p;
int *p3 = &b;
a
为10,b
为5,p
分为a
,p2
分为p
和p3
点b
。
*p = **p2 + *p3;
a
的值(p
点a
)设置为**p2
(p
指向的内容:{{1 }})加a
(指向b):15
*p3
*p3 = (**p2)--;
的值(b
点p3
)设置为b
(**p2
指向的内容:{{1 }}:15。然后p
递减:14。
此时,a
为14,a
为15。
a
b
指向的内容(*p2 = p3;
)设置为p2
。 p
现在将指向p3
指向的内容:*p2
p3
b
的值设置为自身加上15:30
答案 1 :(得分:0)
int a = 10;
int b = 5;
int *p = &a;
int **p2 = &p;
int *p3 = &b;
在这些声明和初始化之后,以下所有情况都是正确的:
p2 == &p
*p2 == p == &a
**p2 == *p == a == 10
p3 == &b
*p3 == b == 5
因此我们可以用指针表达式替换它们指向的东西:
*p = **p2 + *p3 ==> a = a + b // 10 + 5 == 15
*p3 = (**p2)-- ==> b = a--; // b = 15, a = 14
请记住,x--
评估为x
的当前值,并且副作用将其减1。
因此,在b = a--
中,b
在减量之前获得a
的值。
表达式
之后*p2 = p3 // equivalent to p = p3; p now points to the same thing as p3
我们的表现在看起来像
p2 == &p
*p2 == p == p3 == &b
**p2 == *p == *p3 == b == 15
离开我们
**p2 = **p2 + 15 ==> b = b + 15
因此,当我们完成后,b
为30,a
为14。
答案 2 :(得分:0)
:)
int a = 10;
int b = 5;
int *p = &a;
int **p2 = &p;
int *p3 = &b;
*p = **p2 + *p3;
*p3 = (**p2)--;
*p2 = p3;
**p2 = **p2 + 15;
从上面开始 -
1- 10分配给。
2- 5分配给b。
a的3地址分配给指针变量p。
指针变量'p'的4地址分配给p2(指向指针变量的指针)。将b的地址分配给指针变量p3。
6-我们知道*用于取消引用指针。所以在这里** p2(你可以理解它像*(* p2))首先*将取消引用p2,它将给出a的地址,然后第二个*运算符将使它顺从并给出a的值。所以*(* p2)是a的值。 现在在* p3.p3中的相同表达式中保存b的地址,因此* p3将给出b的值。 你得到的结果是15。
7-在这个表达式中,第一个p2将是deference,然后递减1.如果你知道a现在是15,那么它将在减量后变为14。并且* p3将是15(阅读:http://msdn.microsoft.com/en-us/library/dy3d35h8.aspx)。
8-由于** p2现在为15,因此30将被分配到** p2。 希望我的解释清除你的疑虑。