問題1 指標與引用有什麼區別?

2021-08-25 07:00:10 字數 1959 閱讀 5273

問題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 引用一旦初...