C++中的指针浅淡

     在学习数据结构的过程中,小伙伴们都知道指针的重要性。虽然自己是想重点学习C#编程语言,从事Unity游戏开发相关工作的,但大部分数据结构的书都是以C/C++为基础来阐述,想对于数据结构有更加深刻的理解绕不开指针这一关,所以打算写这一篇文章来对自己指针浅层理解的一种巩固。

     讲指针之前,先要对计算机中的内存和地址有一定的了解。程序中的指令和数据之所以能被计算机所执行,都要先从外部存储器调入内存后执行,所以内存中就会存储了各种各样的数据。而当你想取用其中的任一数据时,CPU就要从内存中精确的帮你找到它并显示出来。

     内存采取了类似于酒店房间的管理方法,被分为许许多多的一段连续的存储单元,内存给这些存储单元都给了一串位置序列,类似于"0x00520520",而这个就叫做地址。内存中的地址是唯一的,不可更改重复,用来标识和区别内存里的存储单元。而CPU执行的机器码就是通过这个唯一的内存地址去取到里面所存储的数据来操作的,底层编译时就是将变量和操作翻译为内存地址进行操作的过程,所以在机器码中没有变量名或变量类型之类的字眼。就像酒店里有很多个房间,每个房间都有相应的房间号,而当有人来入住这个房间时,就相当于往一个内存地址存储了一个数据。当你想找这个人时,就要通过相应的房间号(内存地址)去找到这个人(数据)。

    而当你想找这个人有两种方式,一种是去前台问这个人的名字(变量名)所在的房间号(内存地址) ,再去相应的房间号找。第二种是你直接就知道他的房间号(内存地址),就可以直接去找这个人。这就是间接访问和直接访问的区别。

    有了这些底层的基础就可以更好了解指针了,在C++中,一个变量的地址称为该变量的"指针"。指针也是一种数据,类似于int * p定义了一个指针变量,而它自己也是一种int *类型的变量,表明它是一个int类型的指针,它也有自己相应的内存地址。而指针变量是专门用来存放另一个变量的地址的,不能用来直接存储数据,相当于   int  i  = 0; int * p = i;就相当于指针变量 p 存储了 i 的内存地址。想改变指针所指向的位置,可通过"&"取地址符,int  i  = 0; int * p = i;int   j =   1;  p = &j;而 int * p = i 定义方式也会引发歧义,把int * 当作一种类型名来看,p就是一个int型指针,里面可以存储其他变量的地址,也就是存储着 i 的内存地址。而 *p 呢就可以当作指针变量p指向一个int型变量后的该变量,可以用*p 代替该变量,就像int * p = i,此时*p就代表 i 。

    还有一个容易搞混的地方,& * p 和 * &p的区别,因为它们有相同的优先级,按照从右到左的方式来看,对于& * p首先先进行一次 *p 运算再取地址,如上面所说,*p就代表指针所指向的那个变量,而不只单单存储了它的地址,是代表了它整个变量,相当于&(*p) = &i ;而* &p先取地址再运算,取p的地址,而* &p也就代表了它本身,相当于* &p = p。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值