一、引用
引用的定義:引用是給另外乙個變數其別名,所以引用不會分配記憶體空間,引用是引入了物件的乙個同義詞。
例如:
上述的**,定義了pt2為pt1的引用。通過這樣的定義,pt2和pt1表示同一物件,需要特別注意的是,引用並不產生物件的副本,僅僅是物件的同義詞,因此當執行下面的語句之後
point pt1
(10,10)
;
point &pt2 = pt1;
pt1
.offset(2,2);
pt1和pt2就都具有相同的值,引用必須在定義的時候馬上被初始化,因為它必須是某個具體的東西的同義詞,你不能線定義乙個引用然後初始化它。下面的語句是非法的
引用有兩個主要的用途:作為函式引數以及從函式中返回左值,在下面的內容中講到
point &pt3;
pt3 = pt1;
二、指標傳遞
指標傳遞引數本質上是值傳遞,它所傳遞的是乙個位址值。值傳遞的過程中,被調函式的形式引數作為被調函式的區域性變數處理,即在棧中開闢了記憶體空間以存放由主調函式放進來的實參的值,從而成為了實參的乙個副本,當棧幀回退的時候這個區域性變數就不存在了。值傳遞的特點是被調函式對形式引數的任何操作都是作為區域性變數進行,不會影響主調函式的實參變數的值(這裡是在說實參指標本身的位址不會變)。舉例如下:
結果展示:
void
swap
(int *x, int *y)
intmain
()
![在這裡插入描述](
三、傳引用
傳引用過程中,被調函式的形式雖然也作為區域性變數在棧中開闢了記憶體空間,但是這時存放的是由主調函式放進來的實參變數的位址(int &形式)。被掉函式對形參的任何操作都被處理成間接定址,即通過棧中存放的位址訪問主調函式中的實參變數。當棧幀回退的時候,區域性變數雖然已經不存在了,但是它已經通過實參傳來的位址將位址裡邊的值已經改了。正因如此,被調函式對形參做的任何操作都影響了主調函式中的實參變數。舉例如下:
結果展示:
void
swap
(int &x, int &y)
intmain
()
![在這裡插入描述](
四、引用返回值
如果乙個函式返回了引用,那麼該函式的呼叫也可以被賦值,舉例:
結果展示:
int &func
(int& tmp)
intmain
()
![在這裡插入描述](
五、傳指標和傳引用的區別
雖然它們都是在被調函式棧空間上的乙個區域性變數,但是任何對於引用引數的處理都會通過乙個間接定址的方式操作到主函式中的相關變數。而對於指標傳遞的引數,如果改變被調函式中的指標位址,它將影響不到主調函式的相關變數。如果想通過指標引數傳遞來改變主調函式中的相關變數,那就得使用指向指標得指標,或者引用。
為了進一步了解對指標和引用得區別,我將從編譯得角度來闡述它們之間的關係
程式在編譯時分別將指標和引用新增到符號表上,符號表上記錄的是變數名及變數所對應位址。指標變數在符號表上對應的位址值為指標變數的位址值,而引用在符號表上對應的位址值為引用物件的位址值。符號表生成後就不會再改變,因此指標可以改變其指向的物件(指標變數中的值可以改),而引用物件則不能修改
六、指標和引用的相同點與不同點
不同點:(1)指標是乙個實體,需要分配記憶體空間,引用只是變數的別名,不需要分配記憶體空間
(2)引用在定義的時候必須進行初始化,以後不能夠改變(從一而終);指標在定義的時候不一定要初始化,並且指向的空間可變(見異思遷)。注:引用的值不能為null
(3)有多級指標,但是沒有多級引用
(4)引用沒有const,指標有const,const的指標不可變;(具體指沒有 int& const a這種形式,而const int& a是有
的,前者指引用本身即別名不可改變,引用本來就不可改變,所以不需要這種形式,後者指引用所指的值不可
改變)。
(5)sizeof 引用,得到的是指向的變數的大小,而 sizeof 指標 得到的是指標本身的大小
(6)指標和引用的自增(++)運算意義不一樣,指標是指向下乙個空間,引用是引用的變數值加1
(7)引用訪問乙個變數是直接訪問,而指標訪問乙個變數是間接訪問
(8)引用型別是安全的,而指標不是。(引用比指標多了型別檢查)
C 指標和引用
在深入介紹之前我們首先來看一下指標和引用的定義 指標和引用的區別,然後分別針對指標和引用展開討論,深入細節為何有這些差異。指標和引用的定義,下面用通俗易懂的話來概述一下 而宣告指標是可以不指向任何物件,也正是因為這個原因,使用指標之前必須做判空操作,而引用就不必。其次,引用不可以改變指向,對乙個物件...
C 引用和指標
引用和指標看上去差不多,看上去差不多,其實男寶寶和女寶寶是不一樣的 用起來還是有一定差距。本人菜鳥僅將遇到的問題記錄備案,以便日後翻查 ptrfunc.h ifndef ptrfunc h define ptrfunc h typedef int func int,int struct aa end...
C 指標和引用
有了變數名,為什麼還需要乙個別名呢?c 之所以增加引用型別,主要是把它作為函式引數,以擴充函式傳遞資料的功能 到目前為止我們介紹過函式引數傳遞的兩種情況 1 將變數名作為實參和形參 這時傳給形參的是變數的值,傳遞是單向的 如果在執行函式期間形參的值發生變化,並不傳回給實參 因為在呼叫函式時,形參和實...