C++ポインタ--ポインタ変数

5349 ワード

1.ポインタ変数宣言
  • (1)定義ポインタ変数変数変数変数変数変数変数変数変数変数変数変数変数変数変数定義文int p,*p 1,*q;で定義した変数はすべてポインタ変数です.したがって、この文は、p、p 1、qという3つの整数ポインタ変数を定義する.ポインタ変数は変数アドレスを格納するために使用され、アドレスは通常4バイトであるため、ポインタ変数の長さはいずれも4バイトである.
  • (2)ポインタ変数付与ポインタ変数定義後の値は乱数であり、この乱数がシステム領域のアドレスである場合、そのポインタ変数が指すシステム領域のあるメモリセルに対して付与演算を行い、システム領域のそのセルの内容を変更し、システムのクラッシュを招く可能性がある.したがって、ポインタ変数が定義された後、変数のアドレスまたは0を割り当てる必要があります.ポインタ変数に初期値を割り当てるには、3つのケースがあります.1つ目は、アドレス演算子を取ることです.&」変数アドレスをポインタ変数に割り当てることです.例えば:p=&a;第2のケースは、1つのポインタ変数のアドレスを別のポインタ変数に割り当てることであり、例えば、p 1=p;第3のケースは、q=0のようなポインタ変数に0を割り当てることである.ポインタ変数が変数を指していないことを示します.
  • (3)ポインタ変数の参照ポインタ変数の参照は、ポインタ演算子"*"によって実現される.上記の例では、*pと*p 1はいずれも変数aを表すので、第1の出力文cout<
  • (4)ポインタ変数初期化ポインタ変数は、通常の変数のように、ポインタ変数を定義する際に初期値を付与することができ、前例のように、ポインタ変数pを定義する文は、int*p=&aと書くことができる.

  • 2.ポインタ変数の演算
    ポインタ変数の演算には,賦値演算,関係演算,算術演算の3種類がある.(1)ポインタ変数付与演算ポインタ変数付与演算とは,変数のアドレスをポインタ変数に付与することである.(2)ポインタ変数の算術演算ポインタ変数の算術演算には,主にポインタ変数の自己加算,自己減算,n加算,n減算がある.
    *          
    
         :++;
                       1   ,                 。       ++    ,                   , :=+sizeof()。
    
    *         
    
         :――;
                             。       ――    ,                  , :=―sizeof()。             ,    。
    
    *      n  
    
         :=+n;
           n           n      。       + n    ,                     n, :=+sizeof()*n。
    
    *      n  
    
         :=―n;
    

    3.ポインタ変数の関係演算
    ポインタ変数の関係演算は,ポインタ変数値の大きさ比較,すなわち,2つのポインタ変数内のアドレスを比較し,主に配列要素の判断に用いる.ポインタ変数で1次元実型配列要素和を求め、配列の各要素の値と配列和を出力します.
    # include 
    void main( void )
    {
      int a[5]={1,2,3,4,5};
      int *p,*p1;
      p1=&a[4]+1;
      for (p=&a[0];p'\t';
      int sum=0;
      p=&a[0];
      while (p!=p1) sum+=*p++;
      cout <<"
    sum="
    <<sum<
          :  :
      1 2 3 4 5
      sum=15
               +1  p1,  7.4for    ,    p     ,     &a[0]  p。           p p1     , pa[i]  ,  p         。     p≥p1  。
    
       while   ,  p        , p!=p1 , sum=sum+*p;           sum  ,    p++       p       ,    p=p1  ,          。

    4.ポインタ演算子の混合演算と優先度
  • ポインタ演算子*は、アドレス演算子&の優先度と同じで、右から左へ結合されています.
              : int a, *p=&a;
          :&*p        "*" "&", & (*p)=&a=p 。
          :*&a        "&" "*", * (&a)=*p=a 。
    
  • "+","——","*","&"の優先度は同じで、右から左へ結合します.
  •  int a[4]={100,200,300,400},b;
     int * p=&a[0]; 

    説明の便宜上、システムが配列aに割り当てるヘッダアドレスが1000であると仮定すると、
    ① b=*p++;

    「右から左へ結合する原則によって、式p++の評価順が先」++」の後、すなわち*(p++)である.「++」はpの後が後置++演算子であるため、式の実際の操作は*p値を先に取り、その後p++の自己加算操作を行う.すなわち、付与式b=*p+;b=*p;//b=*p=a[0]=100 p++;//p=p+sizeof(int)=1004"`最終演算の結果はb=100、p=1004はaを指す[1].
     ② b=*++p;

    右から左へ結合する原則に従って、式++pの評価順序は、「先」+++」の後、すなわち:(++p)である.++は、pの前に先行++演算子であるため、式の実際の操作は++pの自己加算操作を行い、後に*p値をとる.すなわち、付与式b=++pである.以下の2つの文に等しい:++p;//p=p+sizeof(int)=1008であり、a[2 b=*p;//b=*p[2]=300を指す最後の演算の結果はb=300であり、p=1008はaを指す[2].
    ③ b=(*p)++;

    カッコ内優先演算のため、式はまず*p(すなわちa[2])の値を取り出してbに割り当て、その後*pの値であるa[2]の内容を1加算する.したがって、式は次の2つの文に等しい:b=*p;//b=a[2]=300 a[2]++ ;//a[2]=300+1=301
    ④ b=*(p++);

    ①から分かるように、この式は*p++に等しく、演算結果は:b=*p;//b=a[2]=301 p++;//p=p+sizeof(int)=1012、aを指す[3]
    ⑤ b=++*p ;

    この式は「*」演算を先に行い、「++」演算を行う.すなわち、*pの値を取り出し、その値に1を加える.したがって、式は実際には、b=++(*p)=++a[3]=400+1=401という演算を行う.pは依然としてa[3]を指している.