C/C++的指针实现原理

#include <stdio.h>
int main(void){
    /**
     *1、以下是通过阅读指针的VB实现代码,自己总结了指针的本质到底是什么,仅供参考,欢迎留言指正  
     *2、关于指针结合具体数据结构的实现,还在学习当中,我会继续完善
     */
    int i = 1024;//分配一块内存空间
    printf("i的值(十进制表示)->%d\n",i);//1024
    printf("i的值(十六进制表示)->%x\n",i);//0000000000000400
    printf("i的地址值(十六进制表示)->%p\n",&i);//000000000061FE1C
    int *p = &i;//相当于给i的地址加一个别名p,类型是int *,所以郝斌老师说“指针就是地址,地址就是指针”
    printf("指针p的值->%p\n",p);//000000000061FE1C
    printf("指针p的值(十六进制表示)->%x\n",p);//000000000061FE10,所以%p和%x都是以十六进制输出,格式不同
    printf("指针p指向i的值(十六进制表示)->%p\n",*p); //0000000000000400
    printf("指针p指向i的值(十进制表示)->%d\n",*p); //1024
    printf("指针p的地址->%p\n",&p); //000000000061FE10
    /**
     * 结论
     * i的内存结构 000000000061FE1C{0000000000000400} 地址{最终指向内存的值}
     * p的内存值结构 000000000061FE10{000000000061FE1C{0000000000000400}} 地址1{地址2{最终指向内存的值}}
     */
    *p=2000;//改变指针p指向i的值,即i的值改为2000
    printf("第一次改变指针p指向i的值(十进制表示)->%d\n",*p);//2000
    printf("第一次改变指针p指向i的值(十六进制表示)->%p\n",*p);//00000000000007d0
    printf("i的值(十进制表示)->%d\n",i);//i的值发生了改变,2000
    /**
     * 结论
     * i的内存结构 000000000061FE1C{00000000000007d0} 地址{最终指向内存的值}
     * p的内存值结构 000000000061FE10{000000000061FE1C{00000000000007d0}} 地址1{地址2{最终指向内存的值}}
     */
   /**
     * //去掉注释测试
     * p=99;//指针p的值改为99,即即为改变了指向变量i的值,解除了指向关系  
     * printf("第一次改变指针p的值->%p\n",p);//原本为i的地址值,修改后地址值变为000000000000063 内存值结构{0000000000000063{}}
     * printf("是否存在指针p指向i的值->%p\n",*p);//运行报错,因为已经改变了指针的p的值,不再指向i,而是指向了一个地址为000000000000063新的内存空间
     */ 
    //&p=20;//编译无法通过,无法以这种方式改变p的地址值,因此要引入指针来改变 指针p的地址值,这就体现出了指针的作用
    //以下方式可以改变指针p的地址值
    int **pp=&p;//指针p的地址取名pp的二级指针
    //pp=3000//改变二级指针pp的值,即为改变了指向一级指针p的值,解除了指向关系
    int *p1=&p;//另一个一级指针p1指向指针p
    //p1=3000//
    printf("一级指针p1的地址值->%p\n",&p1);//指针p1的地址值 000000000061FE00
    printf("一级指针p1的值->%p\n",p1);//指针p的地址值 000000000061FE10
    printf("一级指针p1指向一级指针p的值->%p\n",*p1);//指针i的地址值   000000000061FE1C
    printf("二级指针pp的地址值->%p\n",&pp);//000000000061FE08
    printf("二级指针pp的值->%p\n",pp);//指针p的地址值 000000000061FE10
    printf("二级指针pp指向一级指针p的值->%p\n",*pp);//i的地址值 000000000061FE1C
    printf("二级指针pp指向一级指针p再指向i的值->%p\n",**pp);//i的值 十六进制:00000000000007D0  十进制:2000
    /**
     * 结论
     * i的内存结构 000000000061FE0C{00000000000007d0} 地址{最终指向内存的值}
     * p的内存值结构 000000000061FE10{000000000061FE1C{00000000000007d0}} 地址1{地址2{最终指向内存的值}}
     * p1的内存结构000000000061FE00{000000000061FE10{000000000061FE1C}},p1最终指向内存中的值就是000000000061FE1C
     * pp的内存结构000000000061FE08{000000000061FE10{000000000061FE1C{00000000000007D0}}}
     */
     /**
      * 因此,指针就是地址,地址就是指针,相当于给变量的地址起一个别名,类型为int *,这样就可以进行相应的逻辑操作
      * 
      */
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值