首页
社区
课程
招聘
[原创]二级指针分析
发表于: 2022-3-11 14:35 5823

[原创]二级指针分析

2022-3-11 14:35
5823

一级指针中存放的是普通变量的内存地址
二级指针中存放的是一级指针的地址

二级指针的作用?
  如果指针做实参,那么传实参的指针(地址),就必须使用二级指针。通俗的说,要改变指针的值,必须传指针的指针(地址)

图片描述

根据上面关系图,我们可以理解为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
#include <stdio.h>
#include <string.h>
#include <malloc.h>
 
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;
}
#include <stdio.h>
#include <string.h>
#include <malloc.h>
 
void f(int** ptr1, int* ptr2) {
    int* tmp = ptr2;   
    **ptr1 *= 10;       
    *ptr2 *= 10;       
    ptr2 = *ptr1;       
    *ptr1 = tmp;       

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2022-3-11 17:25 被breeze911编辑 ,原因: 更新
收藏
免费 3
支持
分享
最新回复 (1)
雪    币: 1783
活跃值: (1198)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
感谢分享~
2022-3-11 14:52
0
游客
登录 | 注册 方可回帖
返回
//