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

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

繼續與這種企圖系列員額約指針和引用,開始談論指針,引用今天討論。

一個引用是一個別名為對象,別名。 此外,誰說,這不是我,而是非常里斯斯特勞斯,圍繞他的話題5.5 本書,其內容是太好,我現在才注意到,封面有破波的形式長 我喜歡,覆蓋!

聲明引用

一個引用特定類型宣布加入字符 &(符號或符號)的名稱後,該類型的參考。 請注意,相同的方式聲明的指針,我們正在治療字符作為一個機構,而不是經營者。 有一個經營者申報的指針或引用。 這只是一個符號的語言。 給定一個類型T的表現手段電訊參考。 例如:

  / /聲明一個整數變量的原始。
 / /它也可以字符,浮動等。
 整合 ;

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

 / /與指針,下面的行生成
 / /編譯錯誤。  你可以告訴你我為何?
 r1, & r2 ; 廉政 &r1,與 R2的; 

而在C + +參考提醒一些指針,它們有很大的不同。 相反,指針會出現什麼情況,參考必須在其聲明中初始化。 試圖宣布參考未經初始化生成一個錯誤在編譯時,也就是說,編譯器將隨地吐痰,你的臉“花花公子丟失,失去了!”。 唯一的例外是,以供參考聲明為EXTERN的,因為它們將被初始化的一些其他問題的程序,但這是另一咆哮。

如果您嘗試欺騙宣布帶 extern引用未經初始化的編譯器將不會抱怨。 如果是從未使用過,好,好。 如果編譯器是聰明,並指出這是不使用,你甚至可以將其刪除從列表符號。 但是,如果是用於任何部分程序,鏈接器將笑你的臉笑“未定義參考'nome_da_variavel'。 所以,做事情很好。 說出了一個參考? 因此iniclalize它。 EXTERN的? 你確信你知道自己在做什麼?

背後的邏輯是,提及擬一個名字的東西。 如果你不開機,也不會什麼名稱,則是有意義的。 一個很重要的細節是初始化一個參考, 不是一個值分配給它。 由於 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 ; 字符 鋼筋混凝土= 葷;
    ri = i ; 廉政 =我 ;
 rd = d ;  =Ḏ;

 / / sizeof運算符說大小類型的參數。
 "Size of char:    " << sizeof ( c ) << " bytes" << endl ; 法院 “”“規格的字符:”“”sizeof( )“”“ 字節”“”endl;
 "Size of int:     " << sizeof ( i ) << " bytes" << endl ; 法院 “”“大小int的:”“”sizeof( )“”“ 字節”“”endl;
 "Size of double:  " << sizeof ( d ) << " bytes" << endl ; 法院 “”“大小雙:”“”sizeof( )“”“ 字節”“”endl;

 endl ; 法院 “”endl;

 "Size of char&:   " << sizeof ( rc ) << " bytes" << endl ; 法院 “”“大小的char&:”“”sizeof( )“”“ 字節”“”endl;
 "Size of int&:    " << sizeof ( ri ) << " bytes" << endl ; 法院 “”“大小int的&:”“”sizeof( )“”“ 字節”“”endl;
 "Size of double&: " << sizeof ( rd ) << " bytes" << endl ; 法院 “”“大小雙&:”“”sizeof( )“”“ 字節”“”endl; 

技術為規模的引用的範圍超出本書,但我想談談他們的未來。 現在,我只想說沒有表明,在適用大小的參考相同大小的一個指針。

好部分的故事是經常的大小的指針和引用有關遠不比的大小所引用或尖銳的物體。 我個人從來沒有使用該信息,但對發展或不同架構下的嵌入式系統,它變得更加有趣。

使用參考

使用的參考現在簡單得多的指針,因為經營者,無須提取的地址或取消引用。 變量引用被用作普通的變量,並指出,行動做一個參考總是影響對象引用。

  17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
  廉政x,y;
 rx = x ; 廉政 收發= X信息 ;
 ry = y ; 廉政 &ry = ý;

 ; x = 13;
 ; ý = 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“”endl; / / x的值
 "y:  " << y << endl ; // Valor de y. 法院 “” “Y:”“” “”endl; / / y的價值
 "rx: " << rx << endl ; // Valor de rx == x. 法院 “”“接收:”“” 收發“”endl; / / x的值==收發
 "ry: " << ry << endl ; // Valor de ry == y. 法院 “”“ry:”“”ry“”endl; / / y的價值ry == 

使用參考是透明的,程序員,他並不需要知道這是一個參考。 只需使用它像一個普通的變量。 以我有限的想像看不到有人可以被開除的使用條件不當。 雖然總是有一些精神豬狗屎可以用做參考,更容易獲得絆倒由薩西處理指針。

地址和參考

從觀點的墨菲,醜陋的引用,乏味,無聊的,因為幾乎沒有潛在危險,與他們無關。 即使地址有不少意外的驚喜(會?)。 考慮下面的代碼:

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

 ra = a ; 廉政 = 1;
 rb = b ; 廉政 = B的 ;

 ;= 42;
 ;= 7;

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

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

在17日和18線,我宣布兩個整數變量(可以這樣做的一個例子...). 在20日和21日線我宣布兩個引用,它引用了前兩個變量。 此後,RA和RB變量只是別名變量A和B 如上所述,任何經營者,應用到實際運作的引用的引用的對象,因此,每一對變量參考總是有相同的值。

有趣的要注意的是,解決了引用是完全一樣的地址的變量,他們參考,不像指針,有自己的地址。 為什麼? 因為你下跌Pegadinha做瑪蘭多。 請記住,談論任何營辦商申請一個參考? 嗯,這裡使用&運算符是“地址”,這也是直接應用於原來的變量,而不是在引用。 使用相同的技術忍者獲取規模的引用必須取得他們的地址。

同樣有趣的是,當時的循環機制被設計為盡可能透明的程序員。 尺寸和物理地址的引用是不相關信息的角度來看的'正常'程序在C + +。

之間的差異和共性的指針和引用

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

主要用途為指針,一般與管理和操縱的動態內存,創建和銷毀對象和形狀特殊場合,以及“通過引用傳遞參數”(引用的它)。 由於引用習慣於通過引用(為什麼?)和操作符重載。

基本上,我們只能做參考,可仿效的指針。 另一方面相互並非總是如此。 在巨大的優勢,其中,然而,就是間接成為完全透明的編程。

一個有趣的寓言,以幫助人們更好地理解上的分歧指針和引用是暱稱。 例如:假設一個人,說, 鄧加,是我們的原始變量,該對象。 鄧加已經是引用鄧加,這是一個別名相同的對象是同一個人。 已經是母親鄧加(或鄧加,不管),這是引述穩定手的球迷,可以看作是指向它的指針,因為一些數據提供者的詞彙,對他嘉獎她,其實是間接的目標他。

鏈接

評論

5回應“指針和引用在C + +第2部分”

  1. 盧森博格Caloni於2009年5月2日10:58:00

    偉大的文章!

    不幸的是,引用並不像他們似乎無害。 試想以下情況:

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

     字符串&QueroEconomizarCopiasDeString()
     
       退賽;
        / /哈克黑客入侵
        // espertão...  退賽; / /聰明的傢伙...
      

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

    該解決方案是讓引用作為參數,並只有一個副本:對變量“去”。

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

      廉政main()
     
        pi = new int ; 廉政 *= 國際 ;
    
        / /行代碼忘記誰是皮
    
        ri = * pi ; // acho ponteiros complicado 廉政 皮裡= * / /我的指針複雜
    
        / /更多行代碼忘記RI和PI
    
        刪除 皮;
    
        / Tcharammm ...
    
        ; // é a resposta para tudo, não?= 42,/ /是一切的答案,不是嗎?
      

    這些例子似乎野獸,而不是作為他們似乎不可能。 只要將代碼消毒與設計模式或任何其他胡說,爆炸沒有你知道發生了什麼。

    [] š

  2. 洩密於2009年5月2日12點07

    Caloni,你是一個男人太匆忙 :)

    是的,你絕對正確。 但我讓它繼續下去的目的。
    我還沒有發言,為 const指針或引用,甚至該協會的指針和數組之間,但我不會說。

    感謝您的誇獎,這是非常激勵。

    Abração

  3. 盧森博格Caloni於2009年5月2日20時08

    我天真,我以為我給它退出時,你說:“從觀點的墨菲,引用是醜陋,乏味,無聊的,因為幾乎沒有潛在危險,與他們無關。”在任何這樣你的文章已經推薦到一個初學者,因為它實際上是很好的解釋為那些誰是大膽的差異 C和C + +。

    我在等待的過程。

    [] š

  4. 豪爾赫佩雷拉於2009年5月5日02:36

    合夥人多嘴!

    祝賀文章,非常好!

    [] š

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

留下回复




本站由可濕性粉劑Hashcash