在前兩篇文章引用(上)(中)裡分別講了引用的作用、初始化注意事項以及引用做引數、返回值的相關內容,現在我們繼續將“引用”剩下的基礎知識學完。
內容五:引用的本質 一個指標常量
引用的本質是一個指標常量,這也就解釋了前面一篇講的引用傳遞實際上也是地址傳遞,效果相同。
分析:int &ref=a; 實際上編譯器會自動轉換為 int * const ref = &a;
指標變數:固定指向,可改變指向內容。 換句話說,不能改變指向的記憶體空間 但可以修改記憶體空間內容。這也是為什麼“引用一旦初始化後,不能改變”的原因。改變引用就相當於改變指向。
ref=20 編譯器自動轉換為 解引用 *ref=20;指標常量允許修改內容。
可以透過下圖幫助理解指標常量不能改變指向,但可以改變內容。
瞭解引用的本質能夠更好地理解指標的偉大。引用說白了就是一種特殊的指標,在編譯器上不以常規的指標格式顯示而已。
內容六:常量引用
作用:主要是用來修飾形參,防止誤操作
在函式形參列表中用const關鍵字修飾形參,防止形參改變實參
結合上面兩張圖我們可以看出,列印函式的功能僅僅是想列印變數a,但實際操作上或許有很多行程式碼,這樣突然不小心寫到修改形參的程式碼時很難察覺,因為引用傳遞,甚至修改了實參,這很顯然是我們不希望的。因此使用常量引用形參無法改變實參,防止誤操作。
補充:
1.常量無法被引用
上圖中很明顯編譯器會報錯,因為引用的本質是指標常量,指標接收的是一個地址。很明顯常量無法被引用。
2.加入const關鍵字進行引用初始化時,相當於編譯器臨時開闢一個記憶體空間。此時可以接收常量作為臨時空間的內容,但無法修改,起只讀效果。
上圖中的 const int &ret=10; 相當於 int temp=10; int &ret=temp;
最新評論