-
-
[原创]二级指针分析
-
发表于:
2022-3-11 14:35
5788
-
一级指针中存放的是普通变量的内存地址
二级指针中存放的是一级指针的地址
二级指针的作用?
如果指针做实参,那么传实参的指针(地址),就必须使用二级指针。通俗的说,要改变指针的值,必须传指针的指针(地址)
根据上面关系图,我们可以理解为a存在p里,p存在pp里,解引用一次就往右移动一次。
i,j,p1,p2的值各是多少
我们逐行分析
第一步传参的时候
参数1,形参二级指针,传的p1的地址
参数2,形参指针,传的值,p2的值等于 j 的地址,传值不改自身
根据调用约定从右往左依次入栈
第二步
temp局部变量指向p2
第三步
参数一乘10,参数一指向i, i*10=0,不变
第四步
第五步
第六步
结果为
int
a
=
10
;
int
*
p
=
&a;
int
*
*
pp
=
&p;
int
a
=
10
;
int
*
p
=
&a;
int
*
*
pp
=
&p;
解引用
*
p为a
根据上面关系图往右移动一次
*
p
=
=
a
=
=
10
p是指针类型,里面存的是a的地址,
*
p是解引用得到a,a就是
10
*
pp为p
根据上面关系图往右移动一次
*
pp解引用为p,里面存放的是一级指针的地址,p就是一级指针
*
*
pp为a
根据上面关系图往右移动两次
*
*
pp
=
a
解引用
*
p为a
根据上面关系图往右移动一次
*
p
=
=
a
=
=
10
p是指针类型,里面存的是a的地址,
*
p是解引用得到a,a就是
10
*
pp为p
根据上面关系图往右移动一次
*
pp解引用为p,里面存放的是一级指针的地址,p就是一级指针
*
*
pp为a
根据上面关系图往右移动两次
*
*
pp
=
a
void f(
int
*
*
ptr1,
int
*
ptr2) {
int
*
tmp
=
ptr2;
*
*
ptr1
*
=
10
;
*
ptr2
*
=
10
;
ptr2
=
*
ptr1;
*
ptr1
=
tmp;
}
int
main() {
int
i
=
0
, j
=
20
,
*
p1
=
&i,
*
p2
=
&j;
f(&p1, p2);
return
0
;
}
void f(
int
*
*
ptr1,
int
*
ptr2) {
int
*
tmp
=
ptr2;
*
*
ptr1
*
=
10
;
*
ptr2
*
=
10
;
ptr2
=
*
ptr1;
*
ptr1
=
tmp;
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2022-3-11 17:25
被breeze911编辑
,原因: 更新