App下載

C++ 中的指針與引用:最終指南

焰火燦爛時(shí) 2021-09-01 15:38:40 瀏覽數(shù) (2338)
反饋

指針在C ++是保存另一個(gè)變量的存儲(chǔ)器地址的變量。引用是一個(gè)已經(jīng)存在的變量的別名。一旦引用被初始化為一個(gè)變量,它就不能被更改為引用另一個(gè)變量。因此,引用類似于 const 指針(不要與指向常量值的指針混淆?。?。

主要區(qū)別

指針

  • 指針在聲明后,無論何時(shí)都可以初始化為任意值。
int a = 5;
// some code
int *p = &a;
  • 可以分配一個(gè)指針來指向一個(gè)NULL值。
  • 指針需要使用 ?*?.
  • 指針可以改為指向相同類型的任何變量。

例子:

int a = 5;
int *p;
p = &a;
int b = 6;
p = &b;

參考

  • 引用被聲明時(shí)必須進(jìn)行初始化。
int a = 5;
int &ref = a;
  • 引用不能是NULL.
  • 可以簡單地按名稱使用引用。
  • 一旦引用被初始化為一個(gè)變量,它就不能被更改為引用一個(gè)變量對(duì)象。

其他差異

內(nèi)存詳情

指針在堆棧上有其自己的內(nèi)存地址和大小,而引用共享相同的內(nèi)存地址(與原始變量),但也占用棧堆上的部分空間。

算術(shù)運(yùn)算

可以對(duì)指針執(zhí)行各種算術(shù)運(yùn)算,而沒有稱為引用算術(shù)的東西。(但可以取一個(gè)引用指向的對(duì)象的地址,然后像在?&obj + 6?中那樣對(duì)它進(jìn)行指針運(yùn)算)。

指針和引用在什么時(shí)候使用

性能完全相同,因?yàn)橐迷趦?nèi)部實(shí)現(xiàn)為指針。但是仍然可以記住一些要點(diǎn)來決定什么時(shí)候使用什么:

使用參考:

  • 在函數(shù)參數(shù)和返回類型中。使用指針:
  • 如果需要指針運(yùn)算或傳遞 NULL 指針,請(qǐng)使用指針。例如對(duì)于數(shù)組(請(qǐng)注意,數(shù)組訪問是使用指針?biāo)阈g(shù)實(shí)現(xiàn)的)。
  • 要實(shí)現(xiàn)鏈表、樹等數(shù)據(jù)結(jié)構(gòu)及其算法,因?yàn)橹赶虿煌膯卧瘢覀儽仨毷褂弥羔樀母拍睢?/li>

正如C++ 官方常見問題解答中所說:

可以時(shí)使用引用,必要時(shí)使用指針。

當(dāng)你不需要“重置”時(shí),引用通常優(yōu)先于指針。這通常意味著引用在類的公共接口中最有用。引用通常用在對(duì)象的外觀上,指針用在內(nèi)部。


上述的例外情況是,函數(shù)的參數(shù)或返回值需要一個(gè)“sentinel”引用—一個(gè)不引用對(duì)象的引用。這通常是通過返回/獲取指針,并賦予nullptr值這種特殊意義(引用必須始終別名對(duì)象,而不是取消引用的null指針)來實(shí)現(xiàn)的。


注意:老 C 語言程序員有時(shí)不喜歡引用,因?yàn)樗鼈兲峁┑囊谜Z義在調(diào)用方的代碼中并不明確。然而,經(jīng)過一些C++體驗(yàn),人們很快意識(shí)到這是一種信息隱藏的形式,它是一種資產(chǎn)而不是責(zé)任。例如,程序員應(yīng)該用問題的語言而不是機(jī)器的語言編寫代碼。



C++

0 人點(diǎn)贊