通過簡單的和指針的對照淺談引用

通過簡單的和指針的對照淺談引用

來自專欄 從零開始的計科學習之路

引用是這學期快期末講到的一個概念,因為快到期末了,由於自身的原因這部分學的比較水。之前在寫關於指針的那篇文章時突然發現指針和引用的一個相似之處(早就發現這個共同點的各位大佬請不要笑話我)——在聲明時都需要加一個單目運算符(指針對應的是*,引用對應的是&)。在我的理解中,*和&有一種逆運算的意味。所以我嘗試通過對比理解一下引用這個概念。所以就有了一個將二者進行簡單的類比的想法,稍微試了一下,發現有點可行。

俗話說:

引用是變數的別名。

——很多教材如是說

俗話又說:

實踐是檢驗真理的唯一標準。

——光明日報某期某文章標題

下面我寫了一段極為簡單的代碼嘗試去驗證(不是證明)這個說法

#include<iostream>using namespace std;int main(){ int a = 10; int *p = &a; int &f = a; return 0;}

在調試過程中各個變數的值如下

稍微修改一下這個代碼

#include<iostream>using namespace std;int main(){ int a = 10; int *p = &a; int &f = a; f++; return 0;}

在運行f++;這條語句前各個變數的值如下:

運行這條語句之後:

將f++;分別換成a++;/(*p)++;/p++;調試過程中各個變數的值分別如下:

我們發現修改引用的值的結果和直接修改變數的值以及通過指針間接修改變數的值的最終效果是相同的。

這樣我們就初步驗證了引用是變數的別名這個說法(這個方法其實是不嚴謹的,只是為了和指針對照,嚴謹而又簡單的做法應該是直接觀察&a和&f是否相同)。而且和指針比較,二者的區別主要在於訪問方式不一樣。

和指針做形參時一樣,引用做形參時可以對實參本身而不是對一個複製實參產生的臨時變數進行操作,因為減少了一個創建一個新的臨時變數並初始化的過程,使用引用作為函數的參數也可以在一定程度上增加代碼的效率。而且,我個人認為引用做形參相對來說增強了代碼的可讀性。

寫到這裡我有一個問題,我們可以將函數的返回值的數據類型設置為指針,那麼可不可以將函數的返回類型設置為引用呢?

於是我寫了下面兩段簡單的代碼

第一段,返回值的數據類型為int&

#include<iostream>using namespace std;int& fun1( int &a ){ return a;}int main(){ int a; cin>> a ; const int &c1 = fun1(a); cout<<c1 <<endl; return 0;}

第二段,返回值的數據類型為int

#include<iostream>using namespace std;int fun2( int a){ return a;}int main(){ int a; cin>> a ; const int &c2 = fun2(a); cout<< c2 << endl; return 0;}

上面兩段代碼在輸入相同的整數的情況下的最終運行結果是相同的,所以在這裡我假設函數的返回值是引用的情況和函數的形參是引用的原理相同:直接對變數進行操作,而不是創建臨時變數。

我們通過分別寫一個直接交換變數的值的函數和引用做形參交換變數的值的函數就可以驗證形參實際上是作用域為相應的函數的臨時變數。但是我們如何去證明返回值是否是臨時變數呢?

#include<iostream>using namespace std;int& fun1(int &a){ return a;}int fun2(int a){ return a;}int main(){ int a; cin >> a ; const int &c1 = fun1(a); const int &c2 = fun2(a); cout << &a << endl << &c1 << endl << &c2 << endl; return 0;}

這個函數運行結果表示,a和c1的地址相同,而c2的地址是不同於以上二者的另一個值。

所以說使用引用做參數和返回值為引用的函數情況基本類似:從函數的結果來說,除了可以直接訪問變數之外並沒有什麼區別;從過程來說,使用引用因為減少了創建臨時變數這一步從而在一定程度上增加了代碼的效率。


推薦閱讀:

c++函數如何接受數量不定的函數參數?
long Rq = 1432567; int *x; x = (int *)Rq; printf("%d",*x); 錯誤在哪裡?
C++ 嵌套類類模板特化 error: explicit specialization?
函數聲明/定義,書本上這句話怎麼理解,求大神解答?
std::vector會在不同dll中傳遞修改時帶來影響嗎?

TAG:CC | 編程 | 計算機專業 |