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

5月2、2009年で掲示される+のC / C +

継続は始まった話、参照とポインタで、この試みには、シリーズについての記事へのポインタ参照、今日議論する。

参照がオブジェクトのエイリアスのエイリアスです。 また、人が言う私ではないこれは非常にであるBjarne Stroustrup氏、彼のトピック5.5の約本Cのの内容形式ですので、良いこと私は気に砕ける波があるカバーは、今 私はカバーのように!

参照を宣言する

アンパサンドまたは(参照すると文字追加特定の型であると宣言し、アンパサンドを参照の型の名前の後)。 演算子注意してください宣言のと同じ方法は、ポインタではなく、評価として私たちが治療&文字。 また参照のポインタや宣言は演算 それは言語だけの表記です。 のT指定された型、式はリファレンスのT&Tを意味します。 例:

  / /宣言整数型の変数は、元の。
 / /これは、などが、またされる浮動小数点文字。
 int型 一;

 に変数iの参照/ /宣言
 / /すべてのフォームがあり、同等のが、最初のを好む。
 / /同じ注型のことが参照する必要があります
 / /変数が参照されます。
 ra = i ; int型 ソラ= 私;
 rb = i ; int型の rbを=&アイ ;
 rc = i ; int型 リターンコード= 私;

 /とは異なりポインタ/ラインは以下の生成
 / /コンパイルエラーです。  あなたが言うことができるなぜですか?
 r1, & r2 ; int型 &r1、&r2の。 

いくつかのポインタを思い出させるC + +の参照の間、彼らはかなり異なっています。 ポインタで何が起こるかとは異なり、参照は、宣言で初期化する必要があります。 それはコンパイル時に、コンパイラがあなたの顔に唾する、すなわち、エラーが発生初期化せずに参照を宣言しようとすると"プレイボーイ失わ失われました。" この規則の例外は、参照のみですとして宣言にextern 会話のポイント他のanyに初期化at will、彼らはプログラムが、別ののようです。

あなたはそれをコンパイラが文句を言うされません初期化せずにはextern参照を宣言することでカンニングしようとする。 それは、[OK]を使ったことがない場合。 コンパイラは、スマート、予告、それが使用されません場合は、それもシンボルのリストから削除することができます。 それがどこのプログラムで使用される場合しかし、リンカはあなたの顔で、笑って、"'nome_da_variavelに未定義の参照を笑う"と述べた。 だから物事を正しくありません。 参照を宣言? だからそれをiniclalize。 にextern? あなたは自分が何をやっているか本当に分かっていますか。/そんなことをして本当に大丈夫なんですか。

背後にあるロジックは、これは参照が何かの名前をする予定だったです。 場合は、起動しない、それが何のために、それは理にかなって名前されません。 1つの非常に重要な詳細には、開始に値を代入しないことです参照。 prórioであるBjarneが言うように、ない演算子は参照で動作し、すなわち、方法がない割り当てるには、、、参照して等減算追加します。 参照オブジェクトの別名であるため、各演算子は、リファレンスのNESEのオブジェクトではない役割を果たします。 後は、初期化参照は常に同じオブジェクトを参照。

参照を最初のトラップと同様、ポインタのサイズの問題です。 ポインタ(および他のデータ構造体のサイズが)はsizeof演算子を得ることができるが、参照のサイズは従来の技術では、リファレンスにはsizeof演算子を適用whenので、得ることができない、私たちは実際にオブジェクトの演算子を適用する、それが参照するために、前の段落で見たように。

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

   rc = c ; 文字 リターンコード= Cの;
    ri = i ; int型 = 一;
 rd = d ; ダブル = dは;

 / / sizeof演算子は、同社の引数の型のサイズ。
 "Size of char:    " << sizeof ( c ) << " bytes" << endl ; <"サイズの文字< 裁判所:"<<sizeof演算 (c)の ヒノキ"<< 未満<"バイト ;
 "Size of int:     " << sizeof ( i ) << " bytes" << endl ; <"サイズのint < 裁判所:"<<sizeof演算 (1)<<"バイト"<< ヒノキ。
 "Size of double:  " << sizeof ( d ) << " bytes" << endl ; <"サイズのダブル< 裁判所:"<<sizeof(d)  ヒノキ"<< 未満<"バイト ;

 endl ; 裁判所は、 ヒノキを未満<;

 "Size of char&:   " << sizeof ( rc ) << " bytes" << endl ; <<"サイズ 裁判所 &文字 :"<<sizeof(rc)  <<"バイト"<< ヒノキ。
 "Size of int&:    " << sizeof ( ri ) << " bytes" << endl ; :"<<sizeof演算  裁判所 <<"サイズint(  )<<"バイト"<< ヒノキ。
 "Size of double&: " << sizeof ( rd ) << " bytes" << endl ; <<"サイズ 裁判所 &ダブル :"<<sizeof演算  (RD)<<"バイト"<< ヒノキ。 

参照のサイズを取得するためのテクニックは、このテキストの範囲を超えていますが、私はそれらについては後で説明するつもりです。 今のところ、私は表示せずに言っておこう、該当する場合、参照のサイズはポインタのサイズと同じであること。

物語の良い部分は、ポインタと参照のサイズがはるかに少なく、オブジェクトのサイズよりも適合している多くの場合、指摘またはと呼ばれます。 私は特にその情報を使用する必要はないが、開発や組み込みシステムのためのさまざまなアーキテクチャでは、それはもっと面白いなっている。

参照を使用して

演算子は、アドレスまたはド参照を抽出する必要がないため、参照のuseはずっとポインタよりも簡単です。 変数の参照は、一般的な変数として、その操作は、参照は常にオブジェクトに影響を与える実行注目使用されて参照されます。

  17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
  int型x、y;
 rx = x ; int型 &Rx= ×;
 ry = y ; int型 リュー= yの ;

 ;はx = 13;
 ;はy = 10;

 ; // A atribuição é automaticamente aplicada em x. rxは= 42 / /代入はxですに自動的に適用
 // O incremento é automaticamente aplicado em y.リュー+ + / /インクリメントはyです。に自動的に適用

 "x:  " << x << endl ; // Valor de x. 裁判所 <<"×:"<<Xの<<ヒノキ の値は、x / /
 "y:  " << y << endl ; // Valor de y. 裁判所 <は、<"yは:"<<y yの値の 未満<ヒノキを / /
 "rx: " << rx << endl ; // Valor de rx == x. 裁判所 <<"rxは:"<<Rxの<<ヒノキ / /値Rxの== xの
 "ry: " << ry << endl ; // Valor de ry == y. 裁判所 <は、<"リュー:"<<のリュー<<のヒノキ / /値のリュー== 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型 ソラ= 1;
 rb = b ; int型 &rb= b;

 ;ソラ= 42;
 ; rbを= 7;

 "ra  = " << ra << endl ; // O valor de ra == 42. 裁判所 <<"ソラ="<<ソラ<<ヒノキ / / == 42 RAの値を返します。
 "rb  = " << rb << endl ; // O valor de rb == 7. 裁判所 <<"rbを="<<のrbを<<のヒノキ / / == 7 RBの値です。
 "a   = " << a << endl ; // O valor de a == ra == 42. 裁判所 <は、<"<<1 <<ヒノキ / /値のソラ"= == 42。
 "b   = " << b << endl ; // O valor de b == rb == 7. 裁判所 <<"b ="<<b <<ヒノキ / / bのRBの値== 7。

 "&a  = " << & a << endl ; // O endereço de a. 裁判所 <<"&="<<&アドレス Aの1 << ヒノキ/ /
 "&b  = " << & b << endl ; // O endereço de b. <"&b ="<<&b <<ヒノキ / /アドレスb.対応< 裁判所
 "&ra = " << & ra << endl ; // O endereço de ra == &a. 裁判所 <<"&ソラ="<<&ソラ<<ヒノキ / /のソラアドレス==&Aを
 "&rb = " << & rb << endl ; // O endereço de rb == &b. 裁判所 <<は、"&rb="<<&RB<ヒノキ未満 / /のrbをアドレス==&bで 

行17時18で私は2つの整数変数(1つの例...).でこれを行っている可能性が宣言 行20:21に私は2つの参照を、参照する前の2つの変数を宣言します。 その後変数Ra、Rbは変数のエイリアスあるだけとb 我々は、以前見たように、任意のオペレータは、参照に適用される実際に参照オブジェクトに、、各pairの変数-リファレンスは常に同じ値をhas動作。

注意して面白い部分は、参照のアドレスが正確に変数と同じアドレスが、彼らが参照され、自分のアドレスがあったのポインタとは違って。 なぜですか? のため、落ちた場合はPegadinha Malandroを行う 任意の演算子のその話を覚えておいて参照するために適用される? さて、& 演算子はここを使用参照ではなく、には適用も"れているアドレス"に直接変数を元の。 同じテクニックを参照の大きさを得るために忍者を使ってそれらのアドレスを取得するために必要です。

もう一度楽しい部分は、基準機構は、プログラマに可能な限り透明になるように設計されます。 サイズと参照の物理アドレスは、C + +での通常の'プログラムの観点から無関係な情報です。

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

どちらのポインタと参照は、C + +、またはメカニズムの間接のメカニズムは、与えられた記号(変数)から、私は別のオブジェクトを操作することができます使用されています。

ポインタの主な用途は、一般的に管理し、動的メモリの操作、作成および様々な形と特別な瞬間だけでなく、オブジェクトの破壊に関連して"参照パラメータを渡す"(そう)、それを引用した。 参照はすでに参照(なぜ?)と演算子のオーバーロードを通過で使用されている。

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

面白い寓話が良いポインタと参照の違いを理解するためのニックネームです。 と言う、人はについては例:想像してドゥンガ、。です私たちの元の変数、オブジェクトドゥンガオブジェクトですのエイリアスと同じ、実際には以来、ドゥンガに既に参照人と同じ。 すでにドゥンガ母親(または、ドゥンガ、何でも)は、その群衆として長い引用、それへのポインタと考えられる、褒めため、特定のデータ演算子の語彙行わ彼女は、実際にターゲットにして間接的に彼。

リンク