C/C++:深入分析 指针与引用的优缺点

泪湿孤枕 提交于 2019-12-02 11:39:26

前言

指针和引用本来就是两个完全不同的东西,引用甚至不能被称为对象。所以两者是没有可比性的,也没有什么意义去说谁比谁好,它们负责的工作也是不同的。但我以比较的方式写这篇文章,目的是能更浅显看出他们的特点。

一.常量引用与常量指针

疑难点1
首先我们需要知道的第一个东西是:绑定一个非常量引用必须要类型匹配,否则会显示”非常量引用的初始化值必须为左值“。就算你进行强制类型转换。这比指针可安全多了,因为指针就算被定义成常量指针,经过类型转换,也能够对其指向值进行修改。详细请看这篇博客:const==常量?
所以:在不对内存进行操作时,引用更加安全。

疑难点2
常量引用的第二个特点:常量引用可以绑定:任何一个可以转换成其类型的值都可以绑定。这是什么原理?
如我们执行以下操作时:

double a;
const int &b = a;

实际上编译器会先创建一个const int tmp的临时变量,然后将b绑定到这个临时变量上。为什么可以这样做?
因为绑定一个常量引用本来就不想通过这个引用改变其值,所以将其绑定在一个临时变量上是完全可行的。

但是如果你绑定的是一个非常量引用,你肯定是想通过这个引用修改值的,但如果采取绑定一个临时变量的方法,你就修改不了你想修改的那个变量的值。所以这样做是没有意义的,所以非常量引用的绑定必须类型匹配。

对于是否绑定在一个临时变量上,我们可以做以下测试:
在这里插入图片描述
在这里插入图片描述
可以看出:两者的地址确实不一样。

二.指针常量与引用常量

你可能没有听说过引用常量这个说法,好像也确实没有这个说法。为什么?
第一点:
引用不是一个对象,根本谈不上常量
第二点:
引用只能在初始化初始化完成绑定,也不存在说修改其绑定

三.值传递问题

在我们刚开始学C语言函数时就应该见过这样一个例题:如何写一个函数,交换两个变量的值。之前我们的方法是传指针。
指针就这么独特吗?其实不然,因为传指针其实也是值传递,而我们需要修改的不是指针的值,而是通过这个指针找到指向的变量的内存,对其进行修改。所以只需要值是那个值,而不需要变量还是那个变量。通过这个值我们就能找到那个变量。但是值传递会带来一个问题:效率。当我们从实参传递给函数形参时,还会伴随着形参的建立,调用其构造函数等等一系列操作。但是传引用就能完全避免这一问题,因为传引用只是完成了一次绑定,并没有任何新对象的产生。

四.总结

选择引用在很多时候都会更佳,但是并不是说它就是万能的。指针相对而言,拥有更加的灵活性(类型转换,对同一个地址进行不同的操作),还能够完成对内存的各项操作。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!