前言
指针和引用本来就是两个完全不同的东西,引用甚至不能被称为对象。所以两者是没有可比性的,也没有什么意义去说谁比谁好,它们负责的工作也是不同的。但我以比较的方式写这篇文章,目的是能更浅显看出他们的特点。
一.常量引用与常量指针
疑难点1
首先我们需要知道的第一个东西是:绑定一个非常量引用必须要类型匹配,否则会显示”非常量引用的初始化值必须为左值“。就算你进行强制类型转换。这比指针可安全多了,因为指针就算被定义成常量指针,经过类型转换,也能够对其指向值进行修改。详细请看这篇博客:const==常量?
所以:在不对内存进行操作时,引用更加安全。
疑难点2
常量引用的第二个特点:常量引用可以绑定:任何一个可以转换成其类型的值都可以绑定。这是什么原理?
如我们执行以下操作时:
double a;
const int &b = a;
实际上编译器会先创建一个const int tmp的临时变量,然后将b绑定到这个临时变量上。为什么可以这样做?
因为绑定一个常量引用本来就不想通过这个引用改变其值,所以将其绑定在一个临时变量上是完全可行的。
但是如果你绑定的是一个非常量引用,你肯定是想通过这个引用修改值的,但如果采取绑定一个临时变量的方法,你就修改不了你想修改的那个变量的值。所以这样做是没有意义的,所以非常量引用的绑定必须类型匹配。
对于是否绑定在一个临时变量上,我们可以做以下测试:
可以看出:两者的地址确实不一样。
二.指针常量与引用常量
你可能没有听说过引用常量这个说法,好像也确实没有这个说法。为什么?
第一点:
引用不是一个对象,根本谈不上常量
第二点:
引用只能在初始化初始化完成绑定,也不存在说修改其绑定
三.值传递问题
在我们刚开始学C语言函数时就应该见过这样一个例题:如何写一个函数,交换两个变量的值。之前我们的方法是传指针。
指针就这么独特吗?其实不然,因为传指针其实也是值传递,而我们需要修改的不是指针的值,而是通过这个指针找到指向的变量的内存,对其进行修改。所以只需要值是那个值,而不需要变量还是那个变量。通过这个值我们就能找到那个变量。但是值传递会带来一个问题:效率。当我们从实参传递给函数形参时,还会伴随着形参的建立,调用其构造函数等等一系列操作。但是传引用就能完全避免这一问题,因为传引用只是完成了一次绑定,并没有任何新对象的产生。
四.总结
选择引用在很多时候都会更佳,但是并不是说它就是万能的。指针相对而言,拥有更加的灵活性(类型转换,对同一个地址进行不同的操作),还能够完成对内存的各项操作。
来源:https://blog.csdn.net/weixin_43406295/article/details/102756743