引用與指標的區別

遠方的楓葉發表於2015-05-26

    說起引用和指標,相信大多數人都或多或少的有些許疑問吧,小編來給大家小解一下,講的不好請使勁拍磚,小編承受能力極強,不信你試試。

    先談一下為什麼有了高效的指標還要引入引用呢?

    有過學C語言的同學都知道指標的重要性,它高效靈活,但是實物都有兩面性,高效靈活則意味著容易出錯。對於一個指標,它所指向的物件是靈活的,他可以指向任何一個與它型別相匹配的物件,這一刻它指向物件1,下一刻就有可能指向另一個物件2,這就容易引發安全隱患,如將一個自己定義的指標指向一個系統物件,一旦你對該指標進行操作,就有可能引起系統崩潰,還有就是野指標和未初始化的指標都有安全隱患,為了解決在一定程度上彌補指標的缺點,就引入了指標,注意引用這一概念在C語言中使沒有的,在C++、C#中有,其它語言有沒有小編就不清楚了。

    引用:在實際程式設計中引用主要用做函式的形式引數,它其實就是一個物件的別名,它在定義的時候必須要初始化,這一點與實際生活中給小夥伴起外號是一樣的,你是看人(相當於物件)來起外號(相當於引用),而不是先想外號再找人,並且一旦初始化之後,該引用就只能指向所關聯的物件了,不能再指向其它物件了,就像現實中的你只能有一個合法老婆一樣,對引用的所有操作都相當於對所關聯物件本身的操作。其中const 引用需要你關注。

    對於非const引用,用於初始化引用的必須是一個與該引用同型別的物件,不能是一個常量  

     int a;
     int &s=a;  //ok
     int &j=12; //error

    對於const引用,則可以繫結到不同但相關的型別的物件或繫結到右值。

    繫結到右值的情況如下:  

     int i=43;
     const int &r=43;  //合法
     const int &r2=r+i;  //合法

           繫結到相關型別的物件如下: 

     double dval=3.14;
     const int &ri=dval; //合法

    其實編譯器會把上述程式碼轉換成如下形式的編碼:  

     int temp=dval;         //建立一個臨時的變數
     const int &ri=temp;    //其實繫結到了一個臨時變數物件上,對ri  的操作不會改變dval

    指標:指標實際就是地址,是標識一塊記憶體的一個標識,通過這個標識可以對所指向的記憶體中的資料進行操作,指標儲存在對應型別的指標變數中,注意野指標和未初始化的指標會帶來安全隱患,養成良好習慣,定義指標變數時要對其初始化。指標的用處用很多,需要多加學習。


    總結一下指標與引用的區別:

    1、引用定義的時候必須初始化,而指標不是必須的,但習慣上要進行初始化

    2、引用一旦初始化之後,就只能指向初始化的物件,不能再另指向其他物件了,但指標可以

    3、都可以通過自身來直接操作指向的物件

 



 


相關文章