#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 *,这样就可以进行相应的逻辑操作
*
*/
}
C/C++的指针实现原理
最新推荐文章于 2024-08-16 13:42:11 发布