C++Primer-第二章-ノート

2141 ワード

第二章変数と基礎
2.3複合タイプ
2.3.1参照
2.3.2ポインタ
複合タイプとして、参照と同様に、ポインタは他のオブジェクトへの間接アクセスを実現します.
  • ポインタ自体はオブジェクトであり、ポインタに値とコピーを割り当てることができ、ポインタのライフサイクル内にいくつかの異なるオブジェクトを前後して指すことができます.
  • ポインタは、定義時に初期値を付与する必要はありません.他の組み込みタイプと同様に、ブロックの役割ドメインで定義されたポインタが初期化されていない場合、不確定な値も保持されます.

  • 2.3.2.1ポインタタイプの定義*ポインタタイプを定義する方法は、宣言子を*dの形式に書き、dは変数名である.1つの文にいくつかのポインタ変数が定義されている場合、各変数の前に記号*が必要です.
    int *ip1,*ip2;     
    double dp,*dp2;   

    2.3.2.2取得対象のアドレス&ポインタは、オブジェクトのアドレスを格納します.このアドレスを取得するには、アドレス取りオペレータ(オペレータ&)を使用します.
    int *ip1, *ip2;    // ip1 ip2   int      
    double dp, *dp2;    // dp2   double      ,dp double   

    宣言文では、ポインタのタイプが実際にオブジェクトのタイプを指定するために使用されるため、両方が一致する必要があります.ポインタが別のタイプのオブジェクトを指している場合、そのオブジェクトの操作にエラーが発生します.
    2.3.2.3ポインタ値
    ポインタの値(アドレス)は、次の4つの状態のいずれかになります.
  • はオブジェクトを指します.
  • は、隣接するオブジェクトが占める空間の次の位置を指す.
  • 空のポインタは、ポインタがオブジェクトを指していないことを意味します.
  • 無効ポインタは、上記の場合を除く他の値です.無効なポインタにコピーまたはアクセスしようとする値は、コンパイラがこのようなエラーをチェックする責任を負いません.

  • 2番目および3番目の形式のポインタは有効であるが、これらのポインタは特定のオブジェクトを指していないことは明らかであるため、このようなポインタ(仮定)オブジェクトにアクセスしようとする行為は許されない.
    2.3.2.4ポインタによるオブジェクトへのアクセス
    ポインタがオブジェクトを指している場合、オブジェクトにアクセスするには、デリファレンス(オペレータ*)を使用します.
    int ival = 42;
    int *p = &ival;    // p     ival   ,   p     ival   
    cout << *p;

    ポインタの参照を解除すると、指定されたオブジェクトが得られます.したがって、参照を解除した結果に値を割り当てると、実際にはポインタが指定したオブジェクトに値を割り当てることになります.
    *p = 0;
    cout << * p

    【注意】解参照操作は、オブジェクトを確実に指す有効なポインタにのみ適用されます.&*のように、式の演算子としても、宣言の一部としても現れ、記号のコンテキストが記号の意味を決定します.
    int i = 42;     
    int &r = i;    // &       ,         ,r     
    int *p;        // *        ,         ,p     
    p = &i;        // &       ,       
    *p = i;        // *       ,       
    int &r2 = *p;  // &       ,*       

    宣言文では、複合タイプを構成するために&および*が使用される.式では、ロールが演算子に変わります.
    2.3.2.5空のポインタ
    空のポインタ(null pointer)はオブジェクトを指さず、ポインタを使用しようとする前にコードが空であるかどうかを最初に確認できます.