指針和引用在C + +第2部分

2009年5月2日·張貼在C / C + +

這在有關指針和引用,開始談論有關職位系列企圖繼續指針 ,引用今天討論。

引用是一個對象,別名別名。 又是誰說這是不是我,而是很Bjarne的Stroustrup的 ,圍繞你的5.5主題的書 ,其內容是那麼好,我今天才看到蓋有C的形式在破波 我喜歡這封面!

聲明引用

到特定類型的引用聲明中加入字符 &(符號或符號後的引用類型名稱)。 請注意,如在指針聲明一樣,我們對作為一個等級,而不是一個操作符字符處理。 沒有一個指針或引用聲明 這僅僅是一個符號語言。 給定一個類型T,表現手法T&T參考。 例如:

  / /聲明一個整型變量的原始。
 / /它也可以是char,浮動等。
 INT 我;

 / /聲明引用變量i
 / /所有形式是等價的,但更喜歡第一個。
 / /注意,引用類型必須相同
 / /變量引用。
 ra = i ; INT&RA = I;
 rb = i ; RB = INT&I;
 rc = i ; INT&RC = I;

 / /不像指針,線下生成一個
 / /編譯錯誤。  你知道為什麼嗎?
 r1, & r2 ; INT  R1,R2  ; 

雖然在C + +引用指針記住一點,他們有很大的不同。 不像與指針發生時,一個引用必須被初始化在其聲明。 聲明沒有嘗試初始化它引用在編譯時產生錯誤,即,編譯器會在你的臉上吐“失落的花花公子丟失。” 唯一的例外是供參考的聲明為extern ,因為他們將在一些程序中的其他點初始化,但那是另一個咆哮。

如果您嘗試通過聲明沒有欺騙編譯器初始化外部參考也不會抱怨。 如果是從來沒有使用過,OK。 如果編譯器聰明,注意,不使用,它甚至刪除列表中的符號。 但如果是在任何地方使用該程序,鏈接器將在你的臉上笑一笑“未定義引用”nome_da_variavel。“ 因此,正確地做事情。 聲明一個引用? 所以iniclalize它。 外部? 你確定你知道自己在做什麼?

這背後的邏輯是,參考的目的是成為東西的名稱。 如果你不開機,也不會為任何名稱,那麼它是沒有意義的。 一個非常重要的細節是,開始引用分配一個值給它。 由於 prório Bjarne的說,沒有運營商提述的經營,也就是說,有沒有辦法分配,加,減,與參考等。 作為參考,是一個對象的別名,每個操作員的行為 NESE的對象,而不是在引用。 一旦初始化,引用總是引用相同的對象。

與引用,以及在這個問題上指針的第一個陷阱的大小。 雖然指針(和其他數據結構)的大小可以用sizeof運算符獲得,一個參考大小不能得到常規的技巧,在應用上的參考 sizeof操作符,我們實際上適用於它的對象,是指經營者,正如我們在上一段看到的。

  17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
  字符 C;
 INT 我;
  D;

 rc = c ; 字符 &RC = C;
 ri = i ; INT  RI = I;
 rd = d ;   RD = D;

 / / sizeof運算符表示了其參數的類型的大小。
 "Size of char: " << sizeof ( c ) << " bytes" << endl ; 法院 <<“的字符大小:”<<SIZEOF(  )<<“字節”<<endl;
 "Size of int: " << sizeof ( i ) << " bytes" << endl ; 法院 <<“int大小:”<<SIZEOF(I)<<“字節 ”<<endl;
 "Size of double: " << sizeof ( d ) << " bytes" << endl ; 法院 <<“大小:”<<SIZEOF(D)<<“字節”<<endl;

 endl ; 法院 <<endl;

 "Size of char&: " << sizeof ( rc ) << " bytes" << endl ; 法院 <<“的字符和尺寸:”<<SIZEOF(RC)<<“字節”<<endl;
 "Size of int&: " << sizeof ( ri ) << " bytes" << endl ; 法院 <<“的INT和尺寸:”<<SIZEOF(RI)<<“字節”<<endl;
 "Size of double&: " << sizeof ( rd ) << " bytes" << endl ; 法院 <<“雙和尺寸:”<<SIZEOF(RD)<<“字節”<<endl; 

為引用的大小的技術已經超出了本書的範圍,但我打算對他們以後再說。 現在,我只想說沒有證明,在適用的參考大小是相同的一個指針的大小。

這個故事的很大一部分往往是指針的大小和引用都遠遠不及鏈接或引用的對象的大小有關。 我個人,從未需要使用該信息,但對於開發或嵌入式系統不同的架構,它已經變得更有趣。

使用引用

引用的使用已經遠遠高於那些不要求經營者提取的地址或取消引用指針簡單。 變量引用被用作普通變量,並指出,在參考做了操作總是會影響引用的對象。

  17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
  INT X,Y;
 rx = x ; INT&X = RX;
 ry = y ; INT&Y = RY;

 ; X = 13;
 ; Y = 10;

 ; // A atribuição é automaticamente aplicada em x. RX = 42 / /自動應用的任務是在x
 // O incremento é automaticamente aplicado em y. RY + + / /遞增自動應用到y

 "x: " << x << endl ; // Valor de x. 法院 <<“X:”X <<X <<endl / /
 "y: " << y << endl ; // Valor de y. 法院 <<“Y:”<<Y <<endl / / y的值
 "rx: " << rx << endl ; // Valor de rx == x. 法院 <<“RX:”<<RX <<endl / /值== x的RX
 "ry: " << ry << endl ; // Valor de ry == y. 法院 <<“RY:”<<RY <<endl / / y的值== RY 

使用這種提法是透明的程序員,他並不需要知道這是一個參考。 只需使用像一個普通的變量。 用我有限的想像看不出任何人都可能被逐出教會使用不恰當的參考。 雖然總是有一些豬肉精神,誰可以做參考狗屎,更容易得到絆倒達SACI在處理指針。

地址和參考

從上看墨菲 ,引用是醜陋,乏味和無聊,因為有潛在的危險不大與他們無關。 儘管有許多驚喜的地址(會?) 考慮下面的代碼:

  17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
  10 ; INT A = 10;
 13 ; INT B = 13;

 ra = a ; INT&RA = A;
 rb = b ; INT&B = RB;

 ; RA = 42;
 ; RB = 7;

 "ra = " << ra << endl ; // O valor de ra == 42. 法院 <<“RA =”<<RA <<endl / /的Ra值== 42。
 "rb = " << rb << endl ; // O valor de rb == 7. 法院 <<“RB =”<<RB <<endl / / RB的==值7。
 "a = " << a << endl ; // O valor de a == ra == 42. 法院 <<“A =”<<A <<endl / /的Ra值== A == 42。
 "b = " << b << endl ; // O valor de b == rb == 7. 法院 <<“B =”<<B <<endl / / RB的價值== B == 7。

 "&a = " << & a << endl ; // O endereço de a. 法院 <<“&A =”<<&A <<endl / / A的地址
 "&b = " << & b << endl ; // O endereço de b. 法院 <<“&B =”B. <<&B <<endl / /的地址
 "&ra = " << & ra << endl ; // O endereço de ra == &a. 法院 <<“&RA =”<<&RA <<endl / /的地址RA ==&A
 "&rb = " << & rb << endl ; // O endereço de rb == &b. 法院 <<“&RB =”<<&RB <<endl / / RB的地址==&B 

在17和18行我聲明兩個(整數變量可以做一個例子這 ...). 在線路 20時 21我聲明兩個引用,引用前面兩個變量。 此後的變量RA和RB是變量a ​​和b只是別名 正如我們前面所看到的,適用於任何運營商的引用上實際引用的對象的行為,使每對變量的引用始終具有相同的值。

有趣的部分要注意的是,引用的地址是相同的地址,他們引用變量的指針,而不是有自己的地址。 為什麼呢? 因為你愛上Gotcha條款詐欺 記得大約在沒有操作的東西是適用的參考? 那麼, 與運營商這裡使用的是“地址”,這也是直接應用到原變量和引用沒有。 用忍者擺脫引用的大小相同的技術,需要獲得他們的地址。

同樣有趣的部分是,引用機制的設計是為程序員盡可能透明。 尺寸和引用的物理地址是從編程 C“正常”的觀點無關信息+ +。

之間的差異和相似之處指針和引用

無論是作為間接引用指針機制在C + +或機制用於從一個給定的符號(變量)我能操縱其他對象的。

為指針的主要用途是通常與動態內存管理和操作,創建和不同形狀和特殊時刻對象的破壞,以及“通過引用”(所以引用它)。 由於引用是用於通過引用傳遞多(我不知道為什麼?)和運算符重載。

基本上,我們只能做參考,可以模擬與指針。 已經 recíprocra並非總是如此。 他們中的巨大優勢然而,就是在間接成為完全透明的程序員。

一個有趣的寓言,以幫助更好地理解指針和引用的區別是綽號。 例如:假設一個人,說, 卡洛斯卡伊坦諾Bledorn Verri 。,我們的變量是原始對象鄧加已是卡洛斯卡埃塔諾Bledorn Verri參考,它是同一個對象的別名是同一個人。 已經是鄧加的母親(卡洛斯卡埃塔諾Bledorn或Verri,等等),這是由穩定的手引風機,可以認為是它的指針,用於數據的某些經營者的詞彙,使之成為恭維,實際上是間接目標到它。

鏈接

評論

  • http://caloni.com.br Wanderley Caloni

    大文章!

    不幸的是,引用是無害的,因為他們並不像看起來。 試想以下情況:

    1。 有人返回到非靜態局部變量的引用:

      QueroEconomizarCopiasDeString ( )字符串 放大器; QueroEconomizarCopiasDeString()
     {
       字符串RET;
        / /砍砍砍
        // espertão... 返回 RET / /聰明的傢伙...
     } 

    在這種情況下,範圍結束之前有人使用參考。

    解決的辦法是讓作為參數參考,並為變量“出”只有一個副本。

    2。 有人想使用普通變量的動態存儲器:

      INT主要()
     {
        pi = new int ; INT * PI = int;
    
        / /行代碼忘了誰是圓周率
    
        amp ; ri = * pi ; // acho ponteiros complicado INT  放大器; RI = PI * / /指針苦思冥想
    
        代碼/ /更多線忘記RI和PI
    
        刪除 PI;
    
        / / ... Tcharammm
    
        ; // é a resposta para tudo, não? RI = 42 / /是一切問題的答案,不是嗎?
     } 

    這些例子似乎獸,但不作為,因為它似乎不太可能。 只要代碼被掩蓋的設計模式或任何其他廢話,它沒有你知道發生了什麼爆炸。

    [] S

  • http://caloni.com.br Wanderley Caloni

    大文章!

    不幸的是,引用是無害的,因為他們並不像看起來。 試想以下情況:

    1。 有人返回到非靜態局部變量的引用:

      QueroEconomizarCopiasDeString弦&()
     {
       字符串RET;
        / /砍砍砍
        // espertão... 返回 RET / /聰明的傢伙...
     } 

    在這種情況下,範圍結束之前有人使用參考。

    解決的辦法是讓作為參數參考,並為變量“出”只有一個副本。

    2。 有人想使用普通變量的動態存儲器:

      INT主要()
     {
        pi = new int ; INT * PI = int;
    
        / /行代碼忘了誰是圓周率
    
        ri = * pi ; // acho ponteiros complicado INT  RI = PI * / /指針苦思冥想
    
        代碼/ /更多線忘記RI和PI
    
        刪除 PI;
    
        / / ... Tcharammm
    
        ; // é a resposta para tudo, não? RI = 42 / /是一切問題的答案,不是嗎?
     } 

    這些例子似乎獸,但不作為,因為它似乎不太可能。 只要代碼被掩蓋的設計模式或任何其他廢話,它沒有你知道發生了什麼爆炸。

    [] S

  • http://blabos.org 多嘴

    Caloni,你是一個男人過於草率 :)

    是的,你是對的。 但我讓它去的目的。
    我還沒有發言的還到const指針或引用,甚至也不是指針和數組之間的關聯,但我會說話。

    為感謝讚美,這是非常激勵。

    大擁抱

  • http://blabos.org 多嘴

    Caloni,你是一個男人過於草率 :)

    是的,你是對的。 但我讓它去的目的。
    我還沒有發言的還到const指針或引用,甚至也不是指針和數組之間的關聯,但我會說話。

    為感謝讚美,這是非常激勵。

    大擁抱

  • http://caloni.com.br Wanderley Caloni

    我的天真,我以為這件事已經給你關閉時說:“從墨菲的觀點,引用的醜陋,乏味和無聊,因為幾乎沒有做他們的潛在危險。”在任何這樣,我已經推薦你的文章,因為對於初學者它實際上是非常適用於那些誰是C和C之間的差異解釋冒險 + +。

    我等待續集。

    [] S

  • http://caloni.com.br Wanderley Caloni

    我的天真,我以為這件事已經給你關閉時說:“從墨菲的觀點,引用的醜陋,乏味和無聊,因為幾乎沒有做他們的潛在危險。”在任何這樣,我已經推薦你的文章,因為對於初學者它實際上是非常適用於那些誰是C和C之間的差異解釋冒險 + +。

    我等待續集。

    [] S

  • http://www.jorgepereira.com.br 豪爾赫佩雷拉

    Blaber合作夥伴!

    祝賀的文章,很不錯!

    [] S

  • http://www.jorgepereira.com.br 豪爾赫佩雷拉

    Blaber合作夥伴!

    祝賀的文章,很不錯!

    [] S

  • http://www.caloni.com.br/blog/archives/ultimas-pesquisas-na-blogosfera-nacional Caloni.com.br »博客存檔»最新的研究在全國博客

    [...] [...] Pointeiros和參考

  • http://www.brunodanielmarinho.com 布魯諾

    法律有待進一步

  • http://www.brunodanielmarinho.com 布魯諾

    法律有待進一步

  • http://blabos.pip.verisignlabs.com/ 多嘴

    您好,

    感謝您的讚美。

    時間雖短,但我會寫的程序,盡快。

  • http://blabos.pip.verisignlabs.com/ 多嘴

    您好,

    感謝您的讚美。

    時間雖短,但我會寫的程序,盡快。

  • 開羅羅恰

    您好,我有一個嚴重的問題,解決不了與指針 /引用。

    我需要做環一個社區。 例如,我有A級和三A級申報對象
    A [0]和A [1]鄰居。
    A [1]和A [2]鄰居。
    A [2]和A [0]鄰居。

    我試圖用指針和引用,但時,例如,更新[1],A [0]不能“看到”的轉變。

  • Blaber http://blabos.org 的氣泡

    沒有你想要的細節,你做了什麼,也很難幫助你。

博客評論由Disqus供電