ポインタとCの参照+ +パート2

2009年5月2日- Ĉで掲示される/ C + +の

ポインタと参照は、 ポインタの話を始めたの記事に一連のこの試みは参照今日の議論を続けることに。

参照オブジェクトは、エイリアスのエイリアスです。 加えて、人は、この私にはないが、非常にビャーネStroustrupは、彼の本は、そのコンテンツのトピックを5.5付近ので、私は今では、カバーCの形で砕ける波が通知良い言葉 私は、カバーのように!

宣言参照

参照の型の名前の後に特定のタイプの文字 &(アンパサンドまたはアンパサンドを追加することによって宣言されて参照)。 は、同じ方法で、ポインタの宣言として、私たちの治療に注意文字の機関ではなく、演算子として。 そこへのポインタまたは参照の演算子の宣言です。 これは、言語だけの表記です。 T型を考えると、式を参照のT&Tを意味する 例えば:

  / /整数型の変数オリジナルを宣言します。
 / /また、等フロート文字かもしれない。
 int 私;

 変数iに/ /宣言の参照
 / /すべてのフォームと同等ですが好みの最初の。
 / /注を参照の種類は同じでなければなりません
 / /変数を参照しました。
 ra = i ; int&ソラ= 私;
 rb = i ; int&バリチェロ= 私;
 rc = i ; int&リターンコード= 私;

 ポインタ/ /とは異なり、次の行を生成する
 / /コンパイルエラー。  その理由をお話しいただけますか。
 r1, & r2 ; int&R1、&r2の; 

Ĉは+ +での参照がいくつかのポインタを思い出させる、彼らは非常に異なっています。 何のポインタでは逆に発生すると、参照は、宣言で初期化する必要があります。 コンパイル時にエラーを生成する初期化せずに参照を宣言しようとすると、すなわち、コンパイラはあなたの顔"プレイボーイ失われ、砂州が失わ!"。 としては、プログラムのいくつかの他のポイントで初期化されますが、それは別の暴言は、この規則の唯一の例外は参照用として作らない、宣言された。

場合は、不満はないが、コンパイラが初期化せずにextern参照を宣言することでカンニングしてください。 場合は、[OK]を使用することはありません。 場合、コンパイラはスマートでは、あなたも、シンボルのリストから削除することができます使用されていないと指摘した。 しかし、それはプログラムのどの部分で使用され、リンカはあなたの顔"'にnome_da_variavel'未定義の参照を笑って笑うされます。 だから素敵なことをやる。 参照記載? だから、iniclalize。 作らない? あなたが何をやっている知っているか?

この背後にあるロジックを参照何かの名前を意図したものです。 場合は起動しないと、それは何のため、それは理にかなって名をされません。 1つの非常に重要なの詳細を参照を初期化することですそれに値を割り当てることはありません としてprórioビャーネによると、演算子なし条件、つまりは、そこを割り当てる方法はありません、、、などを参照して加算、減算され動作します。 として参照オブジェクトの別名で、各演算子の行為NESEのオブジェクトではなく、参照。 後は、参照は常に参照が同じオブジェクトを初期化します。

参照を持つ最初のトラップだけでなく、ポインタのサイズの問題です。 一方のポインタ(および他のデータ構造)のサイズを従来の手法で取得することはできませんsizeof演算子は、参照のサイズとするときの参照では、sizeof演算子を適用することから得ることができますが、実際にいる我々は、前の段落で見て、それが参照演算子オブジェクトに適用する。

  17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
  char cを ;
 int 私;
 ダブル D;

   rc = c ; 文字 &= Ĉレッドカード;
    ri = i ; int&= 私;
 rd = d ; ダブル &= 開発;

 / / sizeof演算子は引数の型のサイズだ。
 "Size of char:    " << sizeof ( c ) << " bytes" << endl ; 裁判所は "char型の""サイズ:"""sizeof(℃)"""バイト"""endl;
 "Size of int:     " << sizeof ( i ) << " bytes" << endl ; 裁判所は "int型の""サイズ:"""sizeof(1)""""""endlバイト ;
 "Size of double:  " << sizeof ( d ) << " bytes" << endl ; 裁判所は "2""サイズ:"""sizeof(  )"""バイト"""endl;

 endl ; 裁判所  ""endl;

 "Size of char&:   " << sizeof ( rc ) << " bytes" << endl ; 裁判所は "文字と  ""サイズ :"""sizeof(RC) """バイト """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
  int Xのイン;
 rx = x ; int&送受信= Xの;
 ry = y ; int&リュー= yを ;

 ; Xの= 13;
 ;からy = 10;

 ; // A atribuição é automaticamente aplicada em x.送受信= 42 / /特典が自動的にxに適用されます
 // O incremento é automaticamente aplicado em y.リュー+ + / /増分を自動的に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. 裁判所は "" 、"rx:""" 送受信""endl; / /値== xの送受信
 "ry: " << ry << endl ; // Valor de ry == y. 裁判所は """リュー:""" リュー""endl; / /値はRy == yの 

リファレンスを使用するには、プログラマに透過的に、彼は参照であるかを知る必要はありませんでした。 単に通常の変数と同じように使用します。 と私の限られた想像力をどのように不適切な用語を使用して破門することができますが表示されないことができます。 これは、常に、そのたわごとの参照を行うことができます豚のいくつかの精神が多くのSaciでポインタを処理するためにトリップを取得する方が簡単です。

アドレスおよび参考文献

マーフィーの観点から参照、退屈な醜いし、愚かなので、ほとんどない彼らとは潜在的な危険です。 も、アドレスとして、多くの驚きです(でしょうか?)。 以下のコードを考えます:

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

 ra = a ; int&ソラ=;
 rb = b ; int&バリチェロ= bの ;

 ;ソラ= 42;
 ;バリチェロ= 7;

 "ra  = " << ra << endl ; // O valor de ra == 42. 裁判所は """ソラ=""" ソラ""endl; / /ソラ== 42の値を返します。
 "rb  = " << rb << endl ; // O valor de rb == 7. 裁判所は "" の"r =""" バリチェロ""endl; / /バリチェロ== 7の値を返します。
 "a   = " << a << endl ; // O valor de a == ra == 42. 裁判所は """="""""endl; / /  、ra == == 42の値を返します。
 "b   = " << b << endl ; // O valor de b == rb == 7. 裁判所は """b ="あ ""Bの""endl; / / B はバリチェロ== == 7の値を返します。

 "&a  = " << & a << endl ; // O endereço de a. 裁判所は """&="""&""endl; aの/ /アドレス
 "&b  = " << & b << endl ; // O endereço de b. 裁判所は """&b ="あ ""&bの ""endl; b の/ /アドレス
 "&ra = " << & ra << endl ; // O endereço de ra == &a. 裁判所は """&ソラ ="""ソラ ""endl; / /ソラのアドレス==&Aを
 "&rb = " << & rb << endl ; // O endereço de rb == &b. 裁判所は """&バリチェロ ="""バリチェロ ""endl; / / RBのアドレス==&Bの 

行17で18日私は2つの整数変数を宣言する(一例...).このことかもしれない 行20と21私は2つの参照を宣言すると、前の2つの変数を参照します。 その後は、変数ソラとrbの変数のためだけのエイリアスですaとb 前述したように、任意の演算子は、リファレンスを参照し、実際に参照されるオブジェクト上で動作するため、各ペアの変数の参照は、常に同じ値が適用されます。

注意することが興味深いのは、リファレンスのアドレスを正確にそれが参照する変数は、同じアドレスは、されている自分のアドレスがポインタとは異なり。 なぜ? のでPegadinhaに落ちたMalandroありません。 任意の演算子は、話を覚えて参照するために適用されますか? さて、ここでは、&演算子は、"アドレス"は、また、直接、元の変数と参照されていないが適用されますが使用されます。 同じテクニックを使用する忍者の参照のサイズを取得するそれらのアドレスを取得するために必要です。

再度の楽しさの部分は、参照のメカニズムとしては、プログラマに可能な限り透明にするように設計されています。 サイズと参照の'のビュー'通常のポイントからです無関係な情報をC言語でプログラムを物理アドレス+ +。

相違点とポインタと参照の間の類似性

どちらのポインタと参照をC言語での間接参照メカニズム+ +のか、メカニズムを、特定のシンボルを別のオブジェクトを操作することができる(変数)から使用されます。

ポインタのための主な用途を一般的に管理し、動的メモリ、作成、オブジェクトや特別な行事のために図形の破壊の操作には、同様に"参照によってパラメータを渡すこと"(そう)それを引用関連している。 ので、参照を渡すことに参照によって使用されます(理由は何ですか?)And演算子のオーバーロード。

基本的には、すべて私の参照ポインタをエミュレートすることができますを行うことができます。 他方で相互には常に真ではありません。 それらの大きな利点は、しかしながら、間接的、完全にプログラマに透過的になっています。

興味深い寓話よりポインタと参照の違いを理解するためのニックネームです。 例:その人は、 ドゥンガ、当社独自の変数。 ドゥンガ既にドゥンガへの参照がオブジェクトであるという想像して、それは同じオブジェクトの別名ですが同じ人です。 すでにドゥンガの母(または、ドゥンガ、何でも)は、着実に手をファンに引用されては、データのいくつかのプロバイダの語彙、それを、彼女に褒めて、真理を間接的にターゲットにされているポインタを考慮することができます彼に。

リンク

コメント

5レスポンスを"ポインタとC言語で参照+ +パート2"

  1. ワンダレイCaloni 2009年5月2日10時58分に

    すばらしい記事!

    としてもだ残念なことには無害ではなく、参照されます。 は、次の状況を想像して:

    1。 誰かのローカル変数が非staticに参照を返します:

     文字列&QueroEconomizarCopiasDeString()
     
       文字列RETを;
        ハックハック/ /ハック
        // espertão... 復帰 RETを/ /スマートな男...
      

    この場合には、スコープの前であっても、誰かが参照を使用して終了します。

    このソリューションでは、パラメータとして参照を取得し、1つだけコピーを作成されます:変数"を"アウト。

    2。 誰か、普通の変数などの動的メモリを使用したい:

     メインInt()
     
        pi = new int ; int *パイ= 新しいint;
    
        / /コードの行はパイであることを忘れ
    
        ri = * pi ; // acho ponteiros complicado int&=パイ* / /私のポインタを複雑な
    
        / /コードのほかの行里と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. ホルヘペレイラ 10月2日午前2時36分第5回

    パートナーベラベラしゃべる!

    おめでとう非常に良い記事のために!

    []掲載

  5. [...] [...] PointeirosとReferences

返信コメントを残す




WPのHashCashので電源