C++ポインタ、参照、一般変数の関係

2783 ワード

以前はC言語では,関数の参照はずっとアドレスであったので,ずっと参照をアドレスとしていた.
今C++を使って、実は引用が住所ではないことを発見して、もとは自分でずっと間違っていました.
次の手順で説明します.
/** @function main */
 int main( int argc, char** argv )
 {
    int a=10;   // int   
    int &b=a;   //   
    int *c=&a;  //   
    cout<<"b="<<b<<endl;
    cout<<"&a="<<&a<<endl;
    cout<<"c="<<c<<endl;
    cout<<"&b="<<&b<<endl;
   return 0;
  }

出力:
b=10
&a=0xbfbc0347
c=0xbfbc0347
&b=0xbfbc0347
最初のcoutは、bを参照して、aの結果を出力します.だからC++primerの本の中で言った:引用は変数の別名で、この言葉はとても適切です.コンパイラから見れば、bを使う場所は実はaなので、コンパイラの中で、引用に対して変数を置き換えたのではないかと推測しています.(ps:達人は伝言を残して、撮ってください)
なぜこの発明を引用したのか.引用の主な用途は関数にパラメータを伝達することで、これはC++primer plusのこの本の中で比較的に詳しいです.
2番目のcoutは、aのアドレスを出力し、自然に0 xbfbc 0347です.
3番目のcoutは、出力ポインタcであり、ポインタに格納されているデータがaのアドレスであるため、0 xbfbc 0347でもある.
4番目のcoutは、bを参照するアドレスを出力し、bは実はaであるため、出力されるのはaのアドレスであるため、0 xbfbc 0347でもある.
常参照const:参照されるオブジェクトは定数です.
通常参照を初期化する場合は、任意の式を初期値として使用できます.
/** @function main */
 int main( int argc, char** argv )
 {
    int a=10;
    const int &b=10;
    const int &c=a;
    a=20;
    cout<<"b="<<b<<endl;
    cout<<"&b="<<&b<<endl;
    cout<<"c="<<c<<endl;
    cout<<"&c="<<&c<<endl;
   return 0;
  }
出力:
b=10
&b=0xbfd75e00
c=20
&c=0xbfd75e04
出力から、定数参照は定数10に初期化してもよいし、通常変数に初期化してもよいし、通常変数aの値を変更してもよいことがわかる.cは定数参照であるため,cでaの値を変更することはできないが,a自体は通常int変数であるため,それ自体は変更可能である.
一時量オブジェクト
/** @function main */
 int main( int argc, char** argv )
 {
    float a=10.12;
    const int &b=a;
    cout<<"&a="<<&a<<endl;
    cout<<"&b="<<&b<<endl;
   return 0;
  }
出力アドレスは同じではありません.bは直接aにバインドされていません.コンパイラは手足をしました.
出力:
&a=0xbfdbfa94
&b=0xbfdbfa98
bを参照するにはint型変数をバインドする必要がありますが、aはfloat型です.どうすればいいですか.コンパイラはfloatをintに変換し、bをtempにバインドする一時変数tempを作成します.この一時変数は名前のないオブジェクトです.
コンパイラが使用する方法は、次のコードに似ています.
    float a=10.12;
    const int temp=a;
    const int &b=temp;
という一時変数tempはプログラマーにとって透明で見えません.
定数ポインタvs定数を指すポインタ
通常のポインタ:ポインタ自体は定数で、ポインタ宣言時に初期化する必要があります.初期化後の値は変更できません.
int a=8;
int *const b=&a;
ここでbは永遠にaを指し、×b aの値を変更できます.
定数を指すポインタ:ポインタが指すオブジェクトは定数であり、ポインタで定数オブジェクトの値を変更することはできませんが、ポインタを他の変数に向けることができます.
const int a=8;
const int *b=&a;
const int c=9;
b=&c;
ここでbはaを指すことも、cを指すこともできる.