比較位址和引用
由於c++比較底層,能直接操作到記憶體,同時c++又可以進行物件導向的程式設計。因此c++中的「指標(pointer)」和「引用(reference)」這兩個概念都比較重要。先對幾個基本概念進行複習。
程式中最常見的可以說就是用=
進行的賦值操作。而針對賦值操作,就有了左值和右值的概念:
如int a = 100
,表示將100
這個右值,儲存在了變數a
所表示的佔據4個位元組的int
型別的記憶體位置;而int b = a
中,變數a
為右值,變數b
為左值。因此是取變數a
所對應的具體數值,儲存在變數b
表示的int
型別的記憶體位置。總而言之,c++中乙個變數的名字,實際上對應了記憶體位置和具體數值兩個內容。如下圖:
一直以來就對c++中*
和&
這種比較「非人類」的標記比較頭疼,在這裡再把這些符號再複習一遍,同時鞏固一下對應的概念。
首先一定要區分這兩個符號用在左值和右值上的區別:
上述三種用法可以用下圖總結:
但c++中還有乙個特性就是引用。將&
用在左值上,如在定義乙個變數時加上&
,則表示定義的是乙個引用變數。引用變數必須要在定義的時候就初始化,使得該變數一開始就指向某個具體變數。實際上定義乙個引用變數,就相當於將乙個原有變數所對應的位址和數值新增了乙個名稱:
如上圖,定義指向a
的引用ref
,實際上就相當於在變數a
對應的位址和數值上增加了乙個名稱。因此之後無論是修改a
還是修改ref
,對應位址上的數值均會發生改變:
在使用*
定義指標,或&
定義引用時,符號靠近型別還是靠近變數名都是可以的,如下面兩句都是合法的:
int a =
100;
int* ptr1 =
&a;int
*ptr2 =
&a;
但一定注意在一行定義多個變數時,每個變數名前是否加上符號,才代表該變數是否是指標或引用。如int *p, i
,很明顯p為整數指標,i為整數,即相當於int *p; int i;
;而若寫作int* p, i
,仍然是p為整數指標,i為整數!若想要同時定義多個指標,應該使用int *a, *b, *c
。
最後,比較一下位址和引用的一些差別。首先按下圖定義各種變數:
即分別定義並初始化了整數變數a
和b
,二者明顯對應的是不同位址的不同數值。之後int &ref = a
定義了乙個指向a
的引用,即將a
對應的記憶體和數值新增了乙個名稱ref
。最後int *pt = &a
,定義了乙個指向a
的指標pt
。與引用ref
不同,指標pt
實際上占用了一塊記憶體,只是這塊記憶體儲存的值是變數a
對應的記憶體位址。因此對該指標解引用*pt
實際上也就對應變數a
,作為左值時表示對變數a
重新賦值,作為右值時表示取變數a
對應的值。
之後重新賦值引用ref = b
:
由於引用ref
、變數a
和指標的解引用*pt
實際上指向同一位址,因此這些變數的值都會因此而改變。不過此時變數a
只是在數值上與變數b
相同,二者仍然佔據了不同的記憶體。
之後重新賦值變數b
:
如上所述,變數a
與變數b
二者仍然佔據了不同的記憶體,因此重新賦值變數b
也並不會影響到變數a
,以及指向變數a
的引用ref
和指標pt
。
最後重新賦值指標pt
:
可見將之前指向a
的指標修改為指向b
,實際上也就是修改了指標變數pt
對應的具體數值為變數b
對應的位址。
總而言之,引用與指標的主要區別總結為如下幾點:
C 中的指標和引用
注意本人的部落格都遷移到本人自己搭建的部落格位址,通過此處可檢視。本人在工作之餘學習c 但是可能在訓練過程種,會通過各種刷題的形式去提公升自己,但是這樣在一些公司 尤其是大廠 面試的時候會很尷尬。而c 種的指標和引用有什麼區別和聯絡呢,現在就來說道說道,如有錯誤,敬請大家指正。首先我們來說道說道指標...
c 中的指標和引用
首先 指標是儲存的變數的位址,引用是變數的別名,這個必須記住 單純的給變數取別名沒有任何的意義,作為引數傳遞,能保證引數傳遞過程中不產生任何的副本 引用可以直接操作變數,但指標的話必須通過 p 間接的操作變數,指標可讀性行比較低 引用必須要有初始值 int a 常量必須要有初始值 const int...
C 中的指標和引用
文章中舉了大量的例子,希望讀者可以耐住性子好好讀一下,相信會對指標和引用有底層的了解。1.指標 2.作用 1.宣告指標變數 2.表示指向 取出對應的普通型變數的值 3.舉例 例項一 includeusing namespace std int main 控制台輸出結果 指標變數point的值 0x6...