摘要 關於引用和指標的相同點和聯絡的深入研究

2022-07-20 00:18:32 字數 1468 閱讀 1871

相同點:

都是位址的概念;

指標指向一塊記憶體,它的內容是所指記憶體的位址;引用是某塊記憶體的別名。

區別:指標是乙個實體,而引用僅是個別名;

引用使用時無需解引用(*),指標需要解引用;

引用只能在定義時被初始化一次,之後不可變;指標可變;

引用「從一而終」 ^_^

引用沒有 const,指標有 const,const 的指標不可變;

引用不能為空,指標可以為空;

「sizeof 引用」得到的是所指向的變數(物件)的大小,而「sizeof指標」得到的是指標本身(所指向的變數或物件的位址)的大小;

typeid(t) == typeid(t&) 恒為真,sizeof(t) ==sizeof(t&) 恒為真,

但是當引用作為成員時,其占用空間與指標相同(沒找到標準的規定)。

指標和引用的自增(++)運算意義不一樣;

聯絡引用在語言內部用指標實現(如何實現?)。

對一般應用而言,把引用理解為指標,不會犯嚴重語義錯誤。引用是操作受限了的指標(僅容許取內容操作)。

c++中,指標引數和引用的區別.

從概念上講。指標從本質上講就是存放變數位址的乙個變數,在邏輯上是獨立的,它可以被改變,包括其所指向的位址的改變和其指向的位址中所存放的資料的改變。

而引用是乙個別名,它在邏輯上不是獨立的,它的存在具有依附性,所以引用必須在一開始就被初始化,而且其引用的物件在其整個生命週期中是不能被改變的(自始至終只能依附於同乙個變數)。

在c++中,指標和引用經常用於函式的引數傳遞,然而,指標傳遞引數和引用傳遞引數是有本質上的不同的:

指標傳遞引數本質上是值傳遞的方式,它所傳遞的是乙個位址值。值傳遞過程中,被調函式的形式引數作為被調函式的區域性變數處理,即在棧中開闢了記憶體空間以存放由主調函式放進來的實參的值,從而成為了實參的乙個副本。值傳遞的特點是被調函式對形式引數的任何操作都是作為區域性變數進行,不會影響主調函式的實參變數的值。

而在引用傳遞過程中,被調函式的形式引數雖然也作為區域性變數在棧中開闢了記憶體空間,但是這時存放的是由主調函式放進來的實參變數的位址。被調函式對形參的任何操作都被處理成間接定址,即通過棧中存放的位址訪問主調函式中的實參變數。正因為如此,被調函式對形參做的任何操作都影響了主調函式中的實參變數。

引用傳遞和指標傳遞是不同的,雖然它們都是在被調函式棧空間上的乙個區域性變數,但是任何對於引用引數的處理都會通過乙個間接定址的方式操作到主調函式中的相關變數。而對於指標傳遞的引數,如果改變被調函式中的指標位址,它將影響不到主調函式的相關變數。如果想通過指標引數傳遞來改變主調函式中的相關變數,那就得使用指向指標的指標,或者指標引用。

為了進一步加深大家對指標和引用的區別,下面我從編譯的角度來闡述它們之間的區別:

程式在編譯時分別將指標和引用新增到符號表上,符號表上記錄的是變數名及變數所對應位址。指標變數在符號表上對應的位址值為指標變數的位址值,而引用在符號表上對應的位址值為引用物件的位址值。符號表生成後就不會再改,因此指標可以改變其指向的物件(指標變數中的值可以改),而引用物件則不能修改。

指標和引用的相同點和不同點

相同點 都是位址的概念 指標指向一塊記憶體,它的內容是所指記憶體的位址 而引用則是某塊記憶體的別名。不同點 指標是乙個實體,而引用僅是個別名 引用只能在定義時被初始化一次,之後不可變 指標可變 引用 從一而終 指標可以 見異思遷 引用沒有const,指標有const,const的指標不可變 引用不能...

指標和引用的相同點和不同點

一 指標 下面這個超連結是之前寫的關於指標的詳解 指標詳解 二 引用 引用就是某一變數 目標 的乙個別名,對引用的操作與對變數直接操作完全一樣。簡單點說就是宣告乙個識別符號為引用,就表示該識別符號是另乙個物件的外號。三 引用和指標的相同點 1 指標和引用都可以優化傳參效率 2 都是位址的概念 指標指...

指標和引用的區別與相同點

一 指標和引用的定義和性質區別 1 指標 指標是乙個變數,只不過這個變數儲存的是乙個位址,指向記憶體的乙個儲存單元,即指標是乙個實體 而引用跟原來的變數實質上是同乙個東西,只不過是原變數的乙個別名而已。如 int a 1 int p a int a 1 int b a 上面定義了乙個整形變數和乙個指...