指針是一塊內存的地址值,而引用是一塊內存的別名。安全
從概念上講。指針從本質上講就是存放變量地址的一個變量,在邏輯上是獨立的,它能夠被改變,包括其所指向的地址的改變和其指向的地址中所存放的數據的改變。ide
而引用是一個別名,它在邏輯上不是獨立的,它的存在具備依附性,因此引用必須在一開始就被初始化,並且其引用的對象在其整個生命週期中是不能被改變的(自始至終只能依附於同一個變量)。函數
在C++中,指針和引用常常用於函數的參數傳遞,然而,指針傳遞參數和引用傳遞參數是有本質上的不一樣的:指針
指針傳遞參數本質上是值傳遞的方式,它所傳遞的是一個地址值。值傳遞過程當中,被調函數的形式參數做爲被調函數的局部變量處理,即在棧中開闢了內存空間以存放由主調函數放進來的實參的值,從而成爲了實參的一個副本。值傳遞的特色是被調函數對形式參數的任何操做都是做爲局部變量進行,不會影響主調函數的實參變量的值。對象
而在引用傳遞過程當中,被調函數的形式參數雖然也做爲局部變量在棧中開闢了內存空間,可是這時存放的是由主調函數放進來的實參變量的地址。被調函數對形參的任何操做都被處理成間接尋址,即經過棧中存放的地址訪問主調函數中的實參變量。正由於如此,被調函數對形參作的任何操做都影響了主調函數中的實參變量。生命週期
引用傳遞和指針傳遞是不一樣的,雖然它們都是在被調函數棧空間上的一個局部變量,可是任何對於引用參數的處理都會經過一個間接尋址的方式操做到主調函數中的相關變量。而對於指針傳遞的參數,若是改變被調函數中的指針地址,它將影響不到主調函數的相關變量。若是想經過指針參數傳遞來改變主調函數中的相關變量,那就得使用指向指針的指針,或者指針引用。內存
爲了進一步加深你們對指針和引用的區別,下面我從編譯的角度來闡述它們之間的區別:it
程序在編譯時分別將指針和引用添加到符號表上,符號表上記錄的是變量名及變量所對應地址。指針變量在符號表上對應的地址值爲指針變量的地址值,而引用在符號表上對應的地址值爲引用對象的地址值。符號表生成後就不會再改,所以指針能夠改變其指向的對象(指針變量中的值能夠改),而引用對象則不能修改。編譯
最後,總結一下指針和引用的相同點和不一樣點:class
★相同點:
●都是地址的概念;
指針指向一塊內存,它的內容是所指內存的地址;而引用則是某塊內存的別名。
★不一樣點:
●指針是一個實體,而引用僅是個別名;
●引用只能在定義時被初始化一次,以後不可變;指針可變;引用「從一而終」,指針能夠「見異思遷」;
●引用沒有const,指針有const,const的指針不可變;
●引用不能爲空,指針能夠爲空;
●「sizeof 引用」獲得的是所指向的變量(對象)的大小,而「sizeof 指針」獲得的是指針自己的大小;
●指針和引用的自增(++)運算意義不同;
●引用是類型安全的,而指針不是 (引用比指針多了類型檢查)