C++ポインタ--文字列とポインタ

5224 ワード

  • 文字列と文字列ポインタ文字列を指すポインタで処理する場合、文字列を格納する配列の大きさに関心を持たず、文字列の終端子に処理されたかどうかだけに関心を持つ.例:ポインタによる文字列コピー
  •      # include 
         # include 
         void main(void)
         { char *p1="I am a student" ;
           char s1[30],s2[30];
           strcpy( s1,p1); //         
           char *p2=s2; //   s2    p2
           for (;*p2++=*p1++;); //        
           cout<<"s1="<cout<<"s2="<

    説明:(1)コンパイルシステムが定義文char*p 1="I am a student"を実行する場合、まず、文字列「I am a student」にメモリ領域を割り当て、ポインタ変数p 1にそのメモリ領域ヘッダアドレスを割り当てる.(2)ポインタ変数で文字列をコピーするプロセスは、まずポインタ変数p 2を文字列配列s 2のヘッダアドレスに指向し、その後、付与文*p 2=*p 1によって文字を文字列s 1からs 2にコピーし、p 1、p 2を次の文字ユニットに移動し、文字列終端記号'0'まで順次ループする.すべてのコピープロセスはfor文で完了します.for(;*p 2+=*p 1+;)文の式:
       *p2++=*p1++ 
       *p1=*p2; // s2[i]=s1[i],   p1  s1[i]    p1  s2[i]
       p1++; //  p1 1  s1      
       p2++; //  p2 1  s2      

    上記の文は、p 1が終了文字'0'=0を指すまでループし続け、for文は条件が偽であるため終了する.これにより、文字列s 1が文字配列s 2にコピーされるタスクが完了する.(3)ポインタ変数p 1は、コピー関数strcpy(s 1,p 1)のパラメータとすることができる.
  • 文字型ポインタ変数と文字配列の違い(1)割り当てメモリに文字型ポインタ変数と文字配列を定義する文が以下のように設けられている:
  •    char *pc ,str[100];

    文字配列strには100バイトのメモリユニットが割り当てられ、100文字を格納します.一方、システムはポインタ変数pcに4つのメモリセルのみを割り当て、1つのメモリセルのアドレスを格納する.
    (2)初期化付与意味文字配列は文字ポインタ変数の初期化付与形式と同じであるが,その意味は異なる.
       char str[ ] ="I am a student ! " ,s[200];
       char *pc="You are a student ! " ;

    文字配列の場合、文字列は配列に割り当てられた記憶空間に配置され、文字型ポインタ変数の場合、文字列をメモリに格納してから、格納文字列のメモリ開始アドレスをポインタ変数pcに格納します.
    (3)付与方式文字配列は、その要素に対してのみ付与でき、文字列を文字配列名に付与することはできない.文字ポインタ変数の場合、文字列アドレスは文字ポインタ変数に直接割り当てることができます.
       str="I love China! "; //     str      ,       。
       pc="I love China! ";  //    pc          ,     

    (4)入力方式は文字列を直接文字配列に入力することができ,文字列をポインタ変数に直接入力することはできない.ただし、ポインタ変数が指す文字列は直接出力できます.
       cin >> str //  
       cin >> pc //  
       cout<//  

    (5)値の変更プログラム実行中は,文字配列名が示す先頭アドレスは変更できないが,ポインタ変数の値は変更できる.
       str=str+5; //  
       pc=str+5; //  

    小結:文字配列s[100]ポインタ変数pc(1)割当てメモリ割当て100個単位割当て4個単位.(2)付与意味文字列は配列記憶空間に格納され,まず文字列をメモリに格納し,格納列のヘッダアドレスをpcに格納する.(3)付与方式は要素ごとに付与できるシリアルアドレスのみpc(4)入力方式に付与できる:シリアル直接入力文字配列文字列直接入力ポインタ変数(5)値の変更はできない:文字配列ヘッダアドレスはポインタ変数の値を変更できない
    以上の違いから,場合によってはポインタ変数で文字列を処理するのが配列で文字列を処理するよりも便利であることがわかる.