問題1
:指標與引用有什麼區別?
等級:初級
指標(pointer
)持有另乙個物件的位址,使我們能夠間接地操作這個物件。引用(reference
)有時候又稱為別名,它可以用作物件的另乙個名字。它們都是讓你間接引用其他物件。
從語法的角度比較,二者主要區別如下: 1)
指標用操作符「*
」和「->
」,引用使用操作符「.」。
2)引用在建立的同時必須初始化,即引用到乙個有效的物件;而指標在定義的時候可以不初始化,在定義後面的任何地方重新賦值。 3)
指標可以被重新賦值以指向另乙個不同的物件。但是,引用則總是指向在初始化時被指定的物件,以後不能改變。 4)
「sizeof(
引用)」得到的是所指向物件的大小,而「sizeof(
指標)」得到的是指標本身的大小。 5)
指標和引用的加法(+)
、減法(-
)、自增(++
)、自減(--
)等運算意義不一樣。 6)
引用不支援引用陣列,指標支援指標陣列。
深入討論:
上述答案可能不夠完整,但是基本覆蓋了指標和引用的主要區別。可能一些讀者還想新增如下兩個區別: 1)
不存在null
引用,引用必須與合法的儲存單元關聯,而指標則可以是null。
2)程式為指標變數分配記憶體區域,而引用不分配記憶體區域。
對此,我不敢苟同。
首先,我們來看看是否存在null
引用。c++
不允許將引用初始化為null
,所以如下的**無法通過編譯:
char& rc = null; //
讓引用指向空值
但是,使用如下**,我們就可以建立乙個null
引用,該**的執行結果將是不確定的。
char *pc = 0; //
設定指標為空值
char& rc = *pc; //
讓引用指向空值
接著,讓我們看看程式是否為引用分配記憶體區域呢?c++
標準並沒有對此作出規定,所以我認為這完全取決於編譯器,我們不能武斷地說程式會或不會為引用分配記憶體區域。
對於上述指標和引用區別中的第三點,我們可以以另外一種方式來陳述:引用全部是const
型別,它總是指向在初始化時被指定的物件;指標有const
型別。讓我們借用《c++ faq
》第二版章節11.13
中的示例來解釋一下這句話。
class fred ;
void f(fred& const a);
void g(const fred& const a);
void sample(fred& a)
如果在visual studio 2008
中編譯上述**,你會得到警告資訊「anachronism used : qualifiers on reference are ignored
」。如果希望去掉該警告資訊,我們可以對**進行如下修改。
class fred ;
void f(fred& a);
void g(const fred& a);
void sample(fred& a)
如果使用gcc
,你會得到一些錯誤資訊,該程式將無法通過編譯。
《more effective c++
》條款1。
《c++ primer
》第四版章節3.2
和3.6。
《c++ faq
》第二版第11
章。
1 指標與引用的區別
指標 指標是位址傳遞,但其本質上是值傳遞,通常實參傳給形參時,被調函式的形參作為被調函式的區域性變數處理,即在棧中開闢了記憶體空間以存放由主調函式放進來的實參的值,從而成為了實參的乙個副本。所以進行指標傳遞時,作為實參的指標本身所存的位址值是不會變的,但指標所指位址中的內容則會根據函式的不同操作而改...
引用和指標有什麼區別
具體的 從現象上看,指標在執行時可改變其所指向的值,而引用一旦和某個物件繫結後就不在改變。這句話可以這樣理解 指標可以被重新賦值以指向另乙個不同的物件。但是引用總指向在初始化時被指定的物件,以後不能改變,但是指定的物件內容可以改變。從記憶體上分配看,程式為指標變數分配記憶體區域,而不用為引用分配記憶...
C 中引用與指標有什麼區別
1 從記憶體分配方面來講,系統為指標變數分配儲存空間,而引用與繫結的變數共享記憶體空間,系統不另外為引用變數分配儲存空間。指標是乙個實體,而引用僅僅是另乙個變數的別名。int main int argc,char argv 2 引用必須初始化,而指標不必,指標可以在需要的時候進行賦值。3 引用一旦初...