あなたは完全にポインタ、参照やconstのを理解するように

今日は、少しC ++入門を追体験自己がより包括的な理解を持っていると信じて、上記の3つのコンセプトをより明確に理解を持っているので、私はすぐに記録し、また、批判をしてください。

1.参照

オブジェクトは、単にエイリアスであるため、基準は、エイリアスは、別名参照変数、参照指定子によって定義された開発は、変数名の宣言であるDの形で書かれた、すなわちのタイプ、操作対象と同一であることができます。

int i =1; int &r = i; //r指向i(r是i的别名,可以通过操作r来改变i的值)、 r=2; cout<<r<<" "<<i<<" "<<endl; //r和i的值都为2 int j=r; //j被初始化为i的值,即为2

人気話すが、実際には参照の割り当て、バインドされたオブジェクト参照に割り当てられた値です。基準値は、実際には、バインドされたオブジェクト参照の値を取得することで取得します。基準自体はオブジェクトではなく、引用文献に定義することができません。

参照初期化されなければならないことに加えて、ちょうど時間の定義を参照して、プログラムは今参照し、その初期値は共に結合ではなく、参照に初期値をコピーしている、と述べました。初期化が完了すると、彼らは参照が別のオブジェクトに再バインドすることはできませんので、基準値とその初期の目標は、一緒にバインドされているので、参照が初期化されなければなりません。

int &r; //错误,引用必须被初始化 int &r=10; //错误,引用类型的初始值必须是一个对象 int i=10,&r=i; //正确,r是一个引用,与i绑定在了一起,i是一个int int j=0; int& r=j,p=j; //正确,r是一个引用,与j绑定,p是一个int

上記のコードは、最後の段落ではありません、なぜ少数の人々は、この問題を無視するがあるかもしれないことを、ここでストレスをrとpは、それへの参照である必要がありますか?
この考え方は間違っている、私は意図的に、上記の記号を引用&2の結果を書い同じですが、書かれた次の変数せずに、int型のバック書いた、rが参照され、pはint型であり、
ここで我々が把握する必要があり基本データ型と文字のリストによって終身刑は、組成物の声明が続きます。唯一の最初の変数のための有効な、上記のコード片に対応し、基本的なデータ型はintで、&宣言子にのみその効果のブレーク後の最初の変数の宣言ですので、どんなに私たちは声明で追加どのように多くの文字以降のintです、独立変数と背中、例えば:

int *&p,q; //p是一个引用,绑定一个指针变量,q是一个int int* p,i,&r=i; //p是指针,i是int,r是引用

参照のより重要な点は、オブジェクトがタイトな試合をバインドするためにどのと参照のタイプであるにもあります。(ありの場合には、2つの例外があり、また一部はのconstをご紹介します)

int i=0,&r1=i; double d=3.14,&r2=d; double &r3=i; //错误,引用类型为double,对象类型为int r1=r2; //double型向int型转换,会丢失精度 cout<<i<<" "<<r1<<" "<<endl;//i和r1的值都为3

2.ポインタ

参照ポインタに似ていますが、他のオブジェクトへの間接的なアクセスを実現。しかし、コントラストを参照して、多くの異なる点があり、一つのポインタ自体は、ポインタ割り当て、コピーを許容する、オブジェクトであるが、(一旦結合参照は変更することができない)異なるオブジェクトをポイントを有し、第二に、ポインタは、もはや初期値を定義していないとき。

ポインタは、それがなければならないために、アドレスを取得するために、オブジェクトのアドレスであるアドレスコード&取る必要があり、一般的に(2つの例外を除き、再び脇のまま)、ポインタ・ポイントのタイプ厳密一致するオブジェクト:

int a=1; int *p=&a; //p存放变量a的地址,或者说p是指向变量a的指针 double b=3.14; double *q; q=&b; //q是指向p的指针 int *r=&b //错误,指针类型与对象类型不匹配

ポインタ値(即ち、アドレス)は、4つの状態があります。

  1. オブジェクトへのポイント
  2. 占有スペースに隣接した次の目標位置へのポイント(int型* pを=&I、P ++)
  3. NULLポインタはポインタがどのオブジェクトを指していないこと
  4. 無効なポインタ、上記以外の値すなわち

プログラムはクリアポインタが有効である与えられなければならないので、無効なポインタアクセスの結果はエラーにつながるが、無効なポインタへのアクセス権を与えられる前にタイムエラー、実行時にコンパイルされない、予測不可能です。

第二及び第三のポインタの形で上記は、それが明らか有効であるものの、これらのポインタは、任意のオブジェクトを指していない、それはこれが行われる場合、そのような行動が許されていないオブジェクトポインタにアクセスしようとし、結果は期待できません。

オブジェクトへのポインタポイント場合は、溶液でオブジェクトにアクセスし、ポインタ参照と併せて以下の例を参照する記号(*演算子)を参照できます。

int i = 42; int &r = i; //r为i的引用 int *p; p = &i; //p是指向i的指针 cout<<*p<<endl; //输出42 *p = 32; //相当于给i赋值 cout<<i<<endl; //输出32 int &r2 = *p; //相当于int &r2 = i; cout<<r2<<endl; //输出32 r2=22; //改变i的值 cout<<i<<" "<<r2<<" "<<*p<<endl; //三者相等,都为22 *p=12; cout<<i<<" "<<r2<<" "<<*p<<endl; //三者相等,都为12 i=2; cout<<i<<" "<<r2<<" "<<*p<<endl; //三者相等,都为2 int j = 52; *p=j; //相当于将j的值赋给i,i=j; cout<<i<<" "<<r2<<" "<<*p<<endl; //三者相等,都为52 p=&j; //将p指向j, j=62; cout<<i<<" "<<r2<<" "<<*p<<endl; //i=r2=52,*p=62 r=j; 相当于i=j, cout<<i<<" "<<r2<<" "<<*p<<endl; //都为62

&と*非常に漠然とした、道を表すことになり、なぜ、人は次のようになり、別の意味の意味を理解するためにいくつかの学生があるかもしれません。確かに&と*シンボルを、両方の演算子の表現として、だけでなく、宣言の一部として表示されるように、シンボルコンテキストは、シンボルの意味を決定します。

int i=2; int &r=i; //&紧随类型名出现,因此是声明的一部分,r是一个引用 int *p; //*紧随类型吗出现,因此是声明的一部分,p是一个指针 p=&i; //&出现在表达式中,是一个取地址符 *p=i; //*出现在表达式中,是一个解引用符 int &r2=*p;//&是声明的一部分,是引用,*是一个解引用符

任意のオブジェクトを指していないヌルポインタは、この方法は、ヌル・ポインタを定義します:

int *p = nullptr;//推荐方法  int *p2=0; int *p3=NULL;//NULL的值就是0,等价int *p3=0

ヌルポインタを取得するための最良の方法は、新たに導入された新しいC ++ 11標準的な方法であり、最初に、nullptr特殊タイプの値は、それがポインタの任意の他のタイプに変換することができるです。前処理変数は、プリプロセッサは自動的にゼロに置き換える、NULLです。新基準では、それはnullptrを使用するのが最善である、同時にNULLを使用しないようにしてみてください。

また、直接でも0にint型の変数、ポインタ変数intに直接割り当てられていないも

int z=0; int *p=z;//错误,不能把int变量直接赋给指针

すでに述べたように、ポインタ、および参照は、他のオブジェクトへの間接的なアクセスを提供することができ、その後、実装の詳細に2つの大きな違いは、参照はそれ自体がオブジェクトは、一度バインディングターゲットを変更することはできませんではありません。ポインタがあれば、それが新たなアドレスのポインタ割り当てを格納されているように、それは新しい目標を指し、異なっています。

int i=2; int *pi=0; //pi是空指针 int *pi2=&i; //pi2指向i int *pi3; //pi3的值无法确定 pi3=pi2; //pi3和pi2都指向同一个对象i pi2=0; //现在pi2不指向任何对象,但pi3还是指向i

ポインタへのポインタ

一般宣言番号修飾子が限定されるものではなく、例えば、有用な** ***ようにポインタへのポインタへのポインタを表し、そして、ポインタへのポインタを表すことができます。

int i=1024; int *pi=&i; //pi指向int型的数 int **ppi=&pi; //ppi指向一个int型的指针

出力I、*および** PPIのPI値は、1024のためのすべて、同じです。

ポインタ参照

上記のように、参照は、参照ポインタがあり、オブジェクトではないので、基準へのポインタが存在しないだろうが、ポインタがオブジェクトです。

int i=42; int *p; //p是一个未被初始化的指针 int *&r=p; //r是一个指向指针p的引用 r=&i; //相当于p=&i; cout<<i<<" "<<*p<<" "<<*r<<endl;//三者的值相等

最後に最寄りのシンボリック変数名(ここでは&)、上記のタイプはあなたに簡単な方法を教えることであるrは何のためには、変数の型を判別するので、ここでは、rを決定するために、確かに、参照R、一部指定子です*ここにある、それは参照はポインタであることを意味し、参照のどのようなタイプの、最終的には、データ型はintで宣言し、その後、つまり、rはint型のポインタへの参照です。後に、このような複雑な定義が理解されます。

3.const修飾子

CONSTは、オブジェクトの値が定数として定義されると、それはオブジェクトを変更できない、定数を定義するために使用されます。

const int buff = 512; buff=1024//错误,试图向const对象赋值 const int i=get_size(); //正确:运行时初始化 const int j = 42; //正确:编译时初始化 const int k; //错误:k是一个未经初始化的变量 int h=12; const int m=h; //正确:h的值拷贝给了m int n=m; //正确:m的值拷贝了n

あなたは、定数への参照として知られているconstオブジェクトへの参照をバインドすることができます。違いは、通常の参照、定数への参照は、それが結合しているオブジェクトを変更するために使用することができないことであり、他方はconstオブジェクト、サブ額面、あるいは式を結合することが一定の基準を可能にします。

const int ci=1024; const int &r1=ci; //正确:引用及其对应的对象都是常量 r1=42; //错误:r1是对常量的引用,不能修改 int &r2 = ci; //错误,非常量引用不能指向常量对象 int i=42; const int &r1=i; //正确:允许常量引用绑定到普通int对象上 const int &r2=42; //正确:r2为常量引用 const int &r3=r1*2; //正确:r3为常量引用 i=2; cout<<r1<<" "<<i<<" "<<r3<<endl; //r1=i=2,r3=84; double d = 3.14; const int &r4 = d; //正确:r4为一个绑定到int对象的常量引用 cout<<d<<" "<<r4<<endl; //d=3.14,r4=3 d=5.15; cout<<d<<" "<<r4<<endl; //d=5.15,r4=3

タイプが異なるタイプおよび値の特定点ができたとしても、このような場合にあちこち基準時両側に一致するように、オブジェクトを指すように、なぜそれは、不思議されなければなりません。どのような別の型に結合した場合、最終的には一定の基準が起こったときに人がいる理由を理解するために、我々は見つける必要があります。

コードのその部分の終わりに、コンパイラは実際整数オブジェクトコンパイラを確保するために結合R4は一時変数を導入し、コードは次の形式となるであろう。

double d=3.14; const int temp=d; const int &r4=temp;

後に、私たちが理解したいように書かれて、あなたはR4が一定でない場合は、許可し、一致していなければならない、あなたが考えることができ、我々は戻って行く前に、R4はCONSTされていない場合は、なぜタイプを入力して、オブジェクト参照することができましたR4に割り当てられ、R4はまた、参照されたオブジェクトの値を変更しますが、ノート、R4は結合は、それがR4 dが参照するようですので、R4は、dの値を変更することはできませんので、代わりにオブジェクトDの一時的な変数であるが、使用することはできませんdの値の変化は、それは意味がありません、C ++はこれを違法行為に分類されます。

および参考文献は、また、一定量又は一定のポインタのための一定の基準点に非常に類似へのポインタは、その値の対象を変更することはできませんすることができ、それが参照する定数も、所定のオブジェクトを指すポインタでなければなりません定数。オブジェクト・ポインタを変更することによってだけでなく、必要な値を指す定数ポインタいわゆるが、オブジェクトの値を指定していないが、他の手段によって変更することができません。

const double pi=3.14; //pi是一个常量,它的值不能改变 double *ptr=&pi; //错误:ptr不能指向常量 const double *cptr = &pi; //正确 *cptr = 2.1; //错误,不能给*cptr赋值 double d = 3.14; cptr = &d; //正确 *cptr=4.1; //错误:不能直接修改*cptr的值 d=4.1 //正确,*cptr=4.1

ポインタ自体が目的であるので、それ自体を説明するため* CONSTポインタが一定の前に配置することができ、同じ意味書き込みを指すポインタ自体の値ことはなく、次のとおりです。

int errNumb = 0; int c=1; int *const curErr = &errNumb; //curErr将一直指向errNumb,不能修改 curErr=&c; //错误,curErr不能修改 *curErr = c; //正确:curErr不能修改,但是*curErr可以修改 cout<<*curErr<<" "<<errNumb<<endl; //都等于1 const double pi = 3.14; double p=4.5; const double *const pip = &pi; //pip是一个指向常量对象的常量指针 pip=&p; //错误 *pip=p; //错误 const int ci=42; int bi = 32; const int *p2=&ci; //正确:p2指向ci const int *const p3=p2; //正确:p3和p2同时指向ci cout<<*p2<<" "<<*p3<<endl; //二者相等 p2=&bi; //p2指向bi,p3指向ci cout<<*p2<<" "<<*p3<<endl; //*p2=32,*p3=42 p2=p3; //正确 int &r=ci; //错误:普通int不能绑定到int常量上

ここでは、左の値を変更し、あなただけの割り当ての成功を見ることができると仮定し、上記のように代入文を決定するためにあなたの方法を教示し、ターゲットの右のようなエラーなしで次のようになります。変更することはできません、P2 = P3 * p2は、しかし、あなたはP2 = P3、なぜINT&R = CI間違っている、それが正常に割り当てることができると仮定すると、あなたが変更にRの値を変更することができますことができるようにP3の値は、影響を受けません、P2を変更するが、値P2を変更することができますCIの値が、ciはconst型を変更することができないので、式は問題です。このような代入文はそう考えることができます。

おすすめ

転載: www.cnblogs.com/maxwelldzl/p/11639410.html