C/C++編程筆記:C++中的指針與引用,又在什么時候使用?

C和C ++支持與大多數(shù)其他編程語言不同的指針。其他語言包括C ++,Java,Python,Ruby,Perl和PHP。?
從表面上看,引用和指針非常相似,都用于使一個變量提供對另一變量的訪問。兩者都提供了許多相同的功能,因此通常不清楚這些不同機(jī)制之間的區(qū)別。在本文中,我將嘗試說明指針和引用之間的區(qū)別。?

指針:指針是一個變量,用于保存另一個變量的內(nèi)存地址。需要使用*運算符將指針取消引用,以訪問其指向的內(nèi)存位置。?
引用:引用變量是別名,即已經(jīng)存在的變量的另一個名稱。引用(如指針)也通過存儲對象的地址來實現(xiàn)。?
可以將引用視為具有自動間接指向的常量指針(不要與指向常量值的指針混淆!),即編譯器將應(yīng)用*運算符。?
差異:??
1.初始化:
指針可以通過以下方式初始化:?
int a = 10;int * p =&a;? ? ? ? ? ??
?或者int * p;p =&a;我們可以在同一步驟或多行中聲明和初始化指針。
在引用中,?int a = 10;int&p = a; //它是正確的? 但int&p; p = a; //這是不正確的,因為我們應(yīng)該一步一步聲明和初始化引用。
注意:編譯器之間的差異可能有所不同。以上差異是針對Turbo IDE的。?

2.重新分配:可以重新分配指針。此屬性對于實現(xiàn)數(shù)據(jù)結(jié)構(gòu)(例如鏈表,樹等)很有用。
請參見以下示例:?
int a = 5;int b = 6;int * p;p =&a;p =&b;
另一方面,引用不能重新分配,必須在初始化時分配。
整數(shù)a = 5;int b = 6;int&p = a;int&p = b; //在這一行它將顯示錯誤,因為“不允許多個聲明”。但是,這是有效的聲明,int&q = p;
3.內(nèi)存地址:指針在堆棧上有其自己的內(nèi)存地址和大小,而引用共享相同的內(nèi)存地址(與原始變量),但也占用了堆棧上的一些空間。
? int&p = a;? cout <<&p << endl <<&a;
4.NULL值:指針可以直接分配為NULL,而引用則不能。與引用關(guān)聯(lián)的約束(無NULL,無重新分配)確?;A(chǔ)操作不會遇到異常情況。
5.間接:您可以使用指向提供額外級別間接的指針。而引用僅提供一種間接級別。即,?
在指針中整數(shù)a = 10;int * p;int ** q; //它是有效的。p =&a;q =&p;而在參考文獻(xiàn)中,int&p = a;整數(shù)&& q = p; //它是對引用的引用,因此是錯誤。
6.算術(shù)運算:可以對指針執(zhí)行各種算術(shù)運算,而沒有所謂的引用算術(shù)。(但是您可以像引用&obj + 5那樣獲取引用指向的對象的地址并對其進(jìn)行指針?biāo)阈g(shù))。 )?

何時使用什么
性能完全相同,因為引用在內(nèi)部作為指針實現(xiàn)。但是,您仍然可以記住一些要點,以決定何時使用什么:??
使用引用 :在函數(shù)參數(shù)和返回類型中。
使用指針: 如果需要使用指針?biāo)阈g(shù)或傳遞NULL指針,請使用指針。例如對于數(shù)組(請注意,數(shù)組訪問是使用指針?biāo)阈g(shù)實現(xiàn)的)。
由于要指向不同的單元格,因此要實現(xiàn)諸如鏈表,樹等的數(shù)據(jù)結(jié)構(gòu)及其算法,我們必須使用指針的概念。
C ++ FAQ Lite中引用:可以使用引用,而必須使用指針。每當(dāng)您不需要“重新放置”時,通常首選使用引用而不是使用指針。這通常意味著引用在類的公共接口中最有用。引用通常顯示在對象的外觀上,而指針則顯示在對象的外觀上。?
上面的例外是函數(shù)的參數(shù)或返回值需要“reseating”引用,即不引用對象的引用。通常最好通過返回/獲取一個指針,并賦予NULL指針特殊的意義來完成此操作(引用必須始終是別名對象,而不是取消引用的空指針)。?
每天學(xué)點小知識,希望對你有幫助~
另外如果你想更好的提升你的編程能力,學(xué)好C語言C++編程!彎道超車,快人一步!筆者這里或許可以幫到你~
微信公眾號:C語言編程學(xué)習(xí)基地
分享(源碼、項目實戰(zhàn)視頻、項目筆記,基礎(chǔ)入門教程)
歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長比自己琢磨更快哦!
