C和C ++支持與大多數其餘編程語言不一樣的指針。其餘語言包括C ++,Java,Python,Ruby,Perl和PHP。 html
從表面上看,引用和指針很是類似,都用於使一個變量提供對另外一變量的訪問。二者都提供了許多相同的功能,所以一般不清楚這些不一樣機制之間的區別。在本文中,我將嘗試說明指針和引用之間的區別。 算法
指針:指針是一個變量,用於保存另外一個變量的內存地址。須要使用*運算符將指針取消引用,以訪問其指向的內存位置。 編程
引用:引用變量是別名,即已經存在的變量的另外一個名稱。引用(如指針)也經過存儲對象的地址來實現。 數組
能夠將引用視爲具備自動間接指向的常量指針(不要與指向常量值的指針混淆!),即編譯器將應用*運算符。 微信
1.初始化:數據結構
指針能夠經過如下方式初始化: app
int a = 10;int * p =&a; 編程語言
或者int * p;p =&a;咱們能夠在同一步驟或多行中聲明和初始化指針。函數
在引用中, int a = 10;int&p = a; //它是正確的 但int&p; p = a; //這是不正確的,由於咱們應該一步一步聲明和初始化引用。性能
注意:編譯器之間的差別可能有所不一樣。以上差別是針對Turbo IDE的。
2.從新分配:能夠從新分配指針。此屬性對於實現數據結構(例如鏈表,樹等)頗有用。
請參見如下示例:
int a = 5;int b = 6;int * p;p =&a;p =&b;
另外一方面,引用不能從新分配,必須在初始化時分配。
整數a = 5;int b = 6;int&p = a;int&p = b; //在這一行它將顯示錯誤,由於「不容許多個聲明」。可是,這是有效的聲明,int&q = p;
3.內存地址:指針在堆棧上有其本身的內存地址和大小,而引用共享相同的內存地址(與原始變量),但也佔用了堆棧上的一些空間。
int&p = a; cout <<&p << endl <<&a;
4.NULL值:指針能夠直接分配爲NULL,而引用則不能。與引用關聯的約束(無NULL,無從新分配)確保基礎操做不會遇到異常狀況。
5.間接:您可使用指向提供額外級別間接的指針。而引用僅提供一種間接級別。即,
在指針中整數a = 10;int * p;int ** q; //它是有效的。p =&a;q =&p;而在參考文獻中,int&p = a;整數&& q = p; //它是對引用的引用,所以是錯誤。
6.算術運算:能夠對指針執行各類算術運算,而沒有所謂的引用算術。(可是您能夠像引用&obj + 5那樣獲取引用指向的對象的地址並對其進行指針算術)。 )
性能徹底相同,由於引用在內部做爲指針實現。可是,您仍然能夠記住一些要點,以決定什麼時候使用什麼:
使用引用 :在函數參數和返回類型中。
使用指針: 若是須要使用指針算術或傳遞NULL指針,請使用指針。例如對於數組(請注意,數組訪問是使用指針算術實現的)。
因爲要指向不一樣的單元格,所以要實現諸如鏈表,樹等的數據結構及其算法,咱們必須使用指針的概念。
C ++ FAQ Lite中引用:可使用引用,而必須使用指針。每當您不須要「從新放置」時,一般首選使用引用而不是使用指針。這一般意味着引用在類的公共接口中最有用。引用一般顯示在對象的外觀上,而指針則顯示在對象的外觀上。
上面的例外是函數的參數或返回值須要「reseating」引用,即不引用對象的引用。一般最好經過返回/獲取一個指針,並賦予NULL指針特殊的意義來完成此操做(引用必須始終是別名對象,而不是取消引用的空指針)。
天天學點小知識,但願對你有幫助~
另外若是你想更好的提高你的編程能力,學好C語言C++編程!彎道超車,快人一步!筆者這裏或許能夠幫到你~
C語言C++編程學習交流圈子【點擊進入】微信公衆號:C語言編程學習基地
分享(源碼、項目實戰視頻、項目筆記,基礎入門教程)
歡迎轉行和學習編程的夥伴,利用更多的資料學習成長比本身琢磨更快哦!