c++的引用和指针

224 篇文章 92 订阅

一、为什么要谈这个问题

这个问题是一个比较基础的问题,大多数人可能不屑于这个问题的回答。可是最近在多个场合下,一些工作十几年以上的老程序员,竟然把引用和指针说得糊里糊涂,甚至好多人的理解都是不正确的。究其原委,不过是形而上罢了。
多少年来,看着别人怎么用,自己就怎么用,反正也没遇到过什么复杂高深的应用的地方,遇到一些小问题,自己也查查度娘,谷哥把事情搞定。于是,便有了一种C/C++也不过如此。具现到这个问题,甚至多年都没人遇到过问题,那么有人来问这种低级的问题,自然从心底就油然而升一种小动物奔腾的景象。
其实,引用和指针,这种最基础的问题,如果都无法搞清楚 ,那么,就是侯捷老师的那句话:“莫在浮砂筑高台”。

二、引用和指针

什么是引用?什么是指针?一般来说,引用是变量的别名;指针是指向内存地址的句柄。从定义的角度来看,指针的范围更大,一切地址皆指针,但不是所有的内存都是变量,所以引用的范围小一些。而且在早期的c++标准中,对右值是无法进行引用的。也就是说,左值才可能会有引用(左右值等说明请参看前面的文章或者直接参看c++标准文档)。
别名是什么意思?举个例子,一个孩子上学前可能叫石头,上学后可能叫爱国。但家里人可能一直叫石头,所以孩子自己(熟悉的人)明白,这两个名字都是自己。如果还有笔名,号之类的,同样如此。
那指针呢?从很早可能就听说过“条条大路通罗马”,这条条大路,就是指针,它指向上罗马,通过这每一条大路,人们就可以走到罗马。

三、二者之间的关系

那指针和引用有什么关系呢?指针和引用是如何实现的呢?这个问题值得回答。指针的实现,其实非常容易,上面提到了,指针其实就是地址的句柄,所以访问指针其实就是找到内存的地址的过程。而在计算机,一切都可以通过地址来访问。如果非要具现化一下,就是这样,在内存中,通过页号再加偏移量(不考虑段,简化之)来找到。类似于在异地找地址,先找到街道(页),再查找门牌号(偏移量)。
引用怎么实现?其实引用在上层逻辑上是一个别名的概念,在底层仍然是通过指针来实现的。毕竟计算机也没有别的方式能访问地址。
在新的c++标准中,提供了右值引用和移动语义一起把左值和右值的应用场景几乎完全模糊起来,这是一个好事,应用越全面,说明本身越强大。
但是二者的区别也是相当明显的,这些在网上有很多说明,比如引用不能空,指针可以多级,自增运算意义,初始化后是否可以改变,cv的不同以及在传参应用等各个方面,都有细节上的差别。这些都需要程序员们引起重视,但在这里并不是分析这个问题,就此略过。
所以学习一个知识点,重点的是要把它的来龙去脉掌握,把它的主干抓住,很多人看问题,错误的倒未必多,但更多的是只看到部分。正所谓一叶障目,却无法管窥见豹。

四、总结

前几天又听到了c++程序员说引用就是取地址的意思,真得不知道说什么好。基础不牢,地动山摇。特别是对于c/c++这类语言,基础的重要性,无论如何反复强调都不为过的。程序员很容易被后面的复杂的技巧和编程模式吸引,但应该明白的是,这些都是在基础上的一种自然的产生。
就如只要建好一座结实的大厦,装修就是看风格了。编程亦也如是!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值