C/C++:深入分析 指針與引用的優缺點

前言

指針和引用本來就是兩個完全不同的東西,引用甚至不能被稱爲對象。所以兩者是沒有可比性的,也沒有什麼意義去說誰比誰好,它們負責的工作也是不同的。但我以比較的方式寫這篇文章,目的是能更淺顯看出他們的特點。

一.常量引用與常量指針

疑難點1
首先我們需要知道的第一個東西是:綁定一個非常量引用必須要類型匹配,否則會顯示”非常量引用的初始化值必須爲左值“。就算你進行強制類型轉換。這比指針可安全多了,因爲指針就算被定義成常量指針,經過類型轉換,也能夠對其指向值進行修改。詳細請看這篇博客:const==常量?
所以:在不對內存進行操作時,引用更加安全。

疑難點2
常量引用的第二個特點:常量引用可以綁定:任何一個可以轉換成其類型的值都可以綁定。這是什麼原理?
如我們執行以下操作時:

double a;
const int &b = a;

實際上編譯器會先創建一個const int tmp的臨時變量,然後將b綁定到這個臨時變量上。爲什麼可以這樣做?
因爲綁定一個常量引用本來就不想通過這個引用改變其值,所以將其綁定在一個臨時變量上是完全可行的。

但是如果你綁定的是一個非常量引用,你肯定是想通過這個引用修改值的,但如果採取綁定一個臨時變量的方法,你就修改不了你想修改的那個變量的值。所以這樣做是沒有意義的,所以非常量引用的綁定必須類型匹配。

對於是否綁定在一個臨時變量上,我們可以做以下測試:
在這裏插入圖片描述
在這裏插入圖片描述
可以看出:兩者的地址確實不一樣。

二.指針常量與引用常量

你可能沒有聽說過引用常量這個說法,好像也確實沒有這個說法。爲什麼?
第一點:
引用不是一個對象,根本談不上常量
第二點:
引用只能在初始化初始化完成綁定,也不存在說修改其綁定

三.值傳遞問題

在我們剛開始學C語言函數時就應該見過這樣一個例題:如何寫一個函數,交換兩個變量的值。之前我們的方法是傳指針。
指針就這麼獨特嗎?其實不然,因爲傳指針其實也是值傳遞,而我們需要修改的不是指針的值,而是通過這個指針找到指向的變量的內存,對其進行修改。所以只需要值是那個值,而不需要變量還是那個變量。通過這個值我們就能找到那個變量。但是值傳遞會帶來一個問題:效率。當我們從實參傳遞給函數形參時,還會伴隨着形參的建立,調用其構造函數等等一系列操作。但是傳引用就能完全避免這一問題,因爲傳引用只是完成了一次綁定,並沒有任何新對象的產生。

四.總結

選擇引用在很多時候都會更佳,但是並不是說它就是萬能的。指針相對而言,擁有更加的靈活性(類型轉換,對同一個地址進行不同的操作),還能夠完成對內存的各項操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章