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

2009年5月2日號發布的的C / C + +

繼續與這種企圖系列篇有關指針和引用,開始談論指針 ,引用今天討論。

一個引用是一個別名為對象,一個別名。 此外,誰說這不是我,而是很比雅尼斯特魯普 ,圍繞他的主題5.5 ,其內容是太好,我只看到現在的封面有一個破波的形式正 我喜歡那個封面!

聲明引用

一個引用到特定類型宣布追加字符 &(與符號或符號 )後的名稱類型的參考。 請注意,同樣的方式在宣言中的指針,我們是治療字符作為一個等級,而不是經營者。 有一個經營者申報的指針或引用。 這只是一個符號的語言。 由於是T型,表現手法電訊參考。 例如:

  / /聲明一個整數變量的原始。
 / /它也可以煤焦,浮動等。
 詮釋 我;

 / /聲明引用變量島
 / /所有形式是等價的,但更喜歡第一個。
 / /注意引用的類型必須相同
 / /該變量的引用。
 ra = i ; 詮釋 = 我;
 rb = i ; 詮釋=& 我;
 rc = i ; 詮釋 鋼筋混凝土= 我;

 / /指針不同,線下生成一個
 / /編譯錯誤。  你可以知道為什麼?
 r1, & r2 ; 詮釋  R1的,  R2的; 

而在C + +引用提醒一些指針,它們有很大的不同。 會發生什麼不同的指針,引用必須初始化在其聲明。 要聲明一個引用沒有初始化它生成一個錯誤在編譯時,編譯器即會在你臉上吐唾沫“失落的花花公子丟失。” 唯一的例外是參考聲明為外部 ,因為它們將被初始化指向任何其他的方案,但這是另一次談話。

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

這背後的邏輯是,一提到計劃是一個名稱的東西。 如果你不開機,它不會為任何名稱,然後它的意義。 一個非常重要的細節是開始, 不是一個引用賦值給它。 由於 prório比亞說,沒有經營者經營上的提述,即有沒有辦法分配,加,減等與參考。 作為參考是一個別名為對象,每個運營商的行為內謝對象,而不是在參考。 一旦初始化,參考始終引用同一個對象。

第一個陷阱與引用,以及指針是問題的大小。 雖然大小的指針(及其他數據結構),可與 sizeof運算符,大小的參考不能獲得常規技術,由於採用 sizeof運算符時的一個統計,我們實際上是在申請經營的對象引用它,因為我們看到在前面的段落。

  17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
  焦炭 權證;
 詮釋 我;
 杜布勒D;

   rc = c ; 焦炭 鋼筋混凝土= C的 ;
    ri = i ; 詮釋 = 我;
 rd = d ; = D的  ;

 / / sizeof運算符說,大小類型的參數。
 "Size of char:    " << sizeof ( c ) << " bytes" << endl ; 法院 “”“大小的字符 :”<<大小 (三 )<<“字節”<< 恩德;
 "Size of int:     " << sizeof ( i ) << " bytes" << endl ; 法院 “”“大小的詮釋 :”<<大小 (一 )<<“字節”<< 恩德;
 "Size of double:  " << sizeof ( d ) << " bytes" << endl ; 法院 “”“大小 :”<<大小 (四 )<<“字節”<< 恩德;

 endl ; 法院 <<恩德;

 "Size of char&:   " << sizeof ( rc ) << " bytes" << endl ; 法院 “”“大小的字符及 :”<<大小 (區局 )<<“字節”<< 恩德;
 "Size of int&:    " << sizeof ( ri ) << " bytes" << endl ; 法院 “”“大小的詮釋及 :”<<大小 (裡 )<<“字節”<< 恩德;
 "Size of double&: " << sizeof ( rd ) << " bytes" << endl ; 法院 “”“雙和大小:”<< 大小 (次 )<<“字節”<< 恩德; 

該技術獲得的大小的引用都超出了本文的範圍,但我打算稍後談論。 現在,我只說沒有顯示出,在適用情況下,大小的參考是相同的大小的一個指針。

好部分的故事是,往往是大小的指針和引用有關遠不比大小的物體指出或轉介。 我從來沒有特別需要使用該信息,但對發展或在不同的體系結構的嵌入式系統,它已經變得更加有趣。

使用參考資料

使用引用比現在更簡單的指針,因為經營者,無須提取地址或取消引用。 變量的引用被用作普通的變量,並指出上執行的操作參考總是影響對象引用。

  17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
  詮釋x,y;
 rx = x ; 詮釋 接收= 十;
 ry = y ; Ry的詮釋 &= Ÿ;

 ; x = 13;
 ;為y = 10;

 ; // A atribuição é automaticamente aplicada em x.接收= 42 / /自動適用的轉讓到x
 // O incremento é automaticamente aplicado em y. Ry的+ + / /增量自動應用到Y

 "x:  " << x << endl ; // Valor de x. 法院 “”“謝:”<<x <<恩德 / / x的值
 "y:  " << y << endl ; // Valor de y. 法院 “”“Ÿ:”<<Ÿ <<恩德 / / y的價值
 "rx: " << rx << endl ; // Valor de rx == x. 法院 “”“處方:”<<處方<<恩德 / / x的值接收==
 "ry: " << ry << endl ; // Valor de ry == y. 法院 “”“Ry的:”<<Ry的<<恩德 / / y的價值Ry的== 

利用職權為透明的程序員,他並不需要知道這是一個參考。 只要使用像一個普通的變量。 用我有限的想像力實在看不出有人可以驅逐使用條款不當。 雖然總是有一些精神豬糞便與誰可以做參考,更容易得到絆倒由薩西處理指針。

地址和引用

從立場, 墨菲 ,被引用的是醜陋,無聊和愚蠢的,因為很少有潛在危害的不關己。 即使有許多驚喜的地址(會?)。 考慮下面的代碼:

  17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
  10 ; 詮釋 1 = 10;
 13 ; 詮釋 b = 13;

 ra = a ; 詮釋 = 1;
 rb = b ; 詮釋 = B的 ;

 ;= 42;
 ;= 7;

 "ra  = " << ra << endl ; // O valor de ra == 42. 法院 “”“嶺=”<<嶺<<恩德 / /的值嶺== 42。
 "rb  = " << rb << endl ; // O valor de rb == 7. 法院 “”“包=”<<包<<恩德 / /包的價值== 7。
 "a   = " << a << endl ; // O valor de a == ra == 42. 法院 “”“1 =”<<1 <<恩德 / /值對嶺== == 42。
 "b   = " << b << endl ; // O valor de b == rb == 7. 法院 “”“b =”<<b <<恩德 / / b的值包== == 7。

 "&a  = " << & a << endl ; // O endereço de a. 法院 “”“&1 =”<<&1 <<恩德 / / a的地址
 "&b  = " << & b << endl ; // O endereço de b. 法院 “”“和B =”<< 和B <<恩德 / / B的地址
 "&ra = " << & ra << endl ; // O endereço de ra == &a. 法院 “”“&=”<<&<<恩德 / /的地址嶺==&答
 "&rb = " << & rb << endl ; // O endereço de rb == &b. 法院 “”“&=”<<&<<恩德 / /包的地址==&灣 

17:18我就行聲明兩個整數變量(可以這樣做一個例子...). 論線 20:21我宣布兩個引用,它引用了前兩個變量。 此後的變量RA與RB只是別名變量A和B 正如我們前面所看到的,任何運營商應用到實際運作上的參考引用的對象,所以每對可變參考始終具有相同的值。

有趣的部分要注意的是,解決了引用是完全一樣的地址的變量,他們參考,不像指針,有自己的地址。 為什麼? 因為你下降Pegadinha做Malandro 請記住,談論任何運營商應用到參考? 嗯,這裡使用的是與運營商的“地址”,也適用於直接對原變量而不是在引用。 用同樣的方法得到的大小忍者的引用都必須取得他們的地址。

同樣有趣的部分是參考機制被設計為盡可能透明的程序員。 尺寸和物理地址的引用是不相關的信息從角度的'正常'程序在C + +。

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

這兩個指針和引用是間接機制在C + +,或所使用的機制,從一個給定的符號(變量)我將能夠操縱另一個對象。

其主要用途為指針,一般與管理和操作的動態內存,創建和銷毀對象的不同形狀和特殊的時刻,以及“通過引用傳遞參數”(所以引用它)。 引用已經被用於通過引用傳遞(為什麼?)和操作符重載。

基本上,我們只能做參考,可仿效的指針。 已經相互並非總是如此。 他們的巨大優勢,但是,就是間接成為完全透明的程序員。

一個有趣的寓言,以幫助人們更好地理解指針和引用的區別是暱稱。 例如:假設一個人,說, 鄧加 ,是我們的原始變量,該對象。 鄧加已經是一個參考鄧加,因為它是一個別名為相同的對象是同一個人。 已是母親的鄧加(或鄧加,等等),只要是所列舉的人群,可以被認為是指向它的指針,因為某些數據運營商的詞彙,使她的讚美,其實是間接的目標他。

鏈接

評論

  • 您好,

    我欣賞讚美。

    時間很短,但寫續集盡快。
  • 等待進一步的法律
  • 合作夥伴布拉布!

    祝賀的文章,很不錯!

    []學生
  • 我的天真,它是認為此事已經結束時,你說:“從墨菲的立場,引用都醜陋,無聊和愚蠢的,因為很少有潛在危害的不關己。” 無論如何,已經推薦你的文章對初學者,因為它實際上是很好的解釋為那些誰是風險投資的差異與 C和C + +。

    我期待的續集。

    []學生
  • 偉大的文章!

    不幸的是,引用都沒有,因為他們似乎無害。 想想以下情況:


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


    QueroEconomizarCopiasDeString&字符串()

    字符串漚;
    / /砍砍砍
    返回漚; / /聰明的傢伙 ...



    在這種情況下兩端的範圍甚至有人使用前的參考。

    解決的辦法是讓一個引用作為參數,並只有一個副本:為變量'出來'。


    2。 有人想用動態內存為普通變量:


    國際主要()

    詮釋 *圓周率=新詮釋;

    / /行的代碼忘記誰是圓周率

    詮釋與裡 =圓周率* / /我覺得複雜的指針

    / /更多行代碼忘記 RI和PI

    刪除圓周率;

    / / Tcharammm ...

    裡 = 42 / /是回答一切,不是嗎?




    這些例子似乎野獸,但不是不可能的,因為他們似乎。 簡單的代碼可以掩蓋的設計模式或任何其他爆炸胡說,它沒有你知道發生了什麼。

    []學生
  • Caloni,你一個人太匆忙:)

    是的,你說得對。 但我讓它去的目的。
    我也沒有發言尚未常量指針或引用,甚至也不是指針和數組之間的關聯,但我會發言。

    感謝您的讚美,它是非常激勵。

    乾杯
博客的評論本站 Disqus