C++_シリーズ独学コース_第_7_レッスン_配列_『C++Primer第四版』

8711 ワード

配列といえば、よく知られているはずですが、C、Pascal、Javaなどの言語には、配列の概念があります.配列のサポートもC++で提供されています.配列は簡単に言えば同じ山です
データ型オブジェクトの集合.ここでは、同じデータ型、集合という2つのポイントを把握します.
 
一、配列
1、定義
     配列は、配列に格納されたオブジェクトのタイプ名、識別子、配列次元数からなる複合データ型です.タイプ名は、配列に格納できるオブジェクトのタイプを指定し、識別子は識別に使用されます.
配列、プログラム内で配列要素を参照するために使用され、次元数は配列がどれだけの配列要素を格納できるかを規定するために使用されます.
配列の定義は次のとおりです.
                [n];  

次に、配列の例を示します.
  int   iArray[10];  //int型オブジェクトを格納する配列を定義し、10個の整数型の配列を格納できます.
2、アクセス
配列要素はvectorと同じように、下付きオペレータでアクセスできます.
たとえば、次のように定義します.
  char chArray[3];    
    chArray[0] = 'A';
  chArray[1] = 'b';
  chArray[2] = '\0';
サブスケールオペレータによって配列の要素にアクセスし、サブスケールは0から計算されるので、最大のサブスケール==配列の要素個数-1; 境界を越えてはいけないので注意が必要です.
配列の境界を越えると、奇妙なエラーが発生しやすい.
3、配列要素の初期化
配列を定義するときに、配列内の要素を同時に初期化できます.次のようになります.
  int  iArray[3] = {10,2,3};  これにより、配列に3つの要素があり、3つの要素が10、2、3に初期化される整数配列が定義されます.すなわちiArray[0]=10;
iArray[1] = 2; iArray[2] = 3;  ここで{}で囲まれた3つの数字を初期リストと呼ぶ.
初期リストが指定されている場合は、配列の長さの定義を省略できます.例:
  int iArray[ ] = {10, 2, 3} ;   これにより、配列の長さが3の整数配列が定義されます.
  char chArray[] = "volcanol";  このように1つの文字型配列を定義し、配列の長さは9である. ここには8文字しかありませんが、なぜ9要素あるのでしょうか.
文字列の文字面値は、システムにnull文字が自動的に追加されるのがデフォルトです.'0'を格納する要素を追加するために、最終的には9つの配列要素があります.
もう1つのケースがあります.
  int iArray[5] = {1, 2, 3} ;  ここでは5つの要素を格納できる配列を定義しますが、初期化リストには3つの要素しか提供されていません.まだ2つの要素が少なく、ここでは
iArray[0] = 1,  iArray[1] = 2;  iArray[2] = 3, iArray[3] = 0 , iArray[4] = 0; 
 
要点:初期化値を指定しないと、配列要素の値は通常の変数と同じになります.
1、グローバル配列は内蔵タイプであれば初期化は0である.
2、ローカル配列が組み込みタイプの場合、ランダム値が得られます.
3、配列がクラスタイプの場合、デフォルトのコンストラクション関数が呼び出されて初期化されます.デフォルトのコンストラクション関数がない場合は、配列要素の初期化リストを表示する必要があります.
 
4、配列のアクセス
配列はvectorと似ていて、下付きでアクセスできます. 
次に例を示します.
int main()
{
    int iArray[10];

    for(int i=0; i != sizeof(iArray)/sizeof(int); i++)
        iArray[i] = i;

    for(int i= 0; i != sizeof(iArray)/sizeof(int); i++)
        cout<<iArray[i]<<endl;

    return 0;
}

これによりiArray配列の要素を0から9に割り当てることができる.実行結果は次のとおりです.
[root@localhost cpp_src]# g++ test.cpp 
[root@localhost cpp_src]# ./a.out 
0
1
2
3
4
5
6
7
8
9

要点sizeofオペレータを使用する場合、sizeofは占有するバイト数を求め、求められるのは配列の長さではないことに注意してください.
Exp:
int main()
{
    cout<<sizeof(L'a')<<endl;

    return 0;
}

プログラム実行結果は以下の通りです.
[root@localhost cpp_src]# g++ test.cpp 
[root@localhost cpp_src]# ./a.out 
4

したがって、次のセグメントに注意する必要があります.
int iArray[10];

for(int i = 0; i != sizeof(iArray); ++i )  //      sizeof   ,         ,         

    iArray[i] = i ;

  
5、配列の下限
int main()
{
    string strArray[2];

    strArray[0] = "volcanol";
    strArray[1] = "hi,";

    cout<<strArray[1]<<strArray[2]<<endl;

    return 0;
}

ここでは境界を越えてアクセスし、出力結果は以下の通りです.
[root@localhost cpp_src]# g++ test.cpp 
[root@localhost cpp_src]# ./a.out 
hi,DiƿLiƿh4��H�\4iƿ~{L|������3��5�_4����ևDiƿP�@��3<iƿ+ 4�yƿ�yƿ�yƿ�yƿ�yƿ�yƿ≥Æ¿≥Æ¿P≥Æ¿␉≥Æ¿┌≥Æ¿/≠Æ¿_≠Æ¿Œ≠Æ¿Ì≠Æ¿æ≠Æ¿¶£Æ¿Î£Æ¿à£Æ¿û£Æ¿·Æ¿"·Æ¿6·Æ¿G·Æ¿Z·Æ¿·Æ¿•·Æ¿ ·Æ¿Á·Æ¿Î·Æ¿Ú·Æ¿<Æ¿^Æ¿┐Æ¿…Æ¿šÆ¿³Æ¿ÎÆ¿ØÆ¿         Ô  !    Р    ÿó«         ␍      4€                                  †
                                                            
                     {jƿi686[root@localhost cpp_src]#    

これは読み出しであり,書き込みであればプログラムエラーを招くに違いないが,システムの制限を迂回してユーザ空間からカーネル空間にジャンプするメカニズムがあれば,
カーネルが不安定です.
 
6、配列に直接値を付けたりコピーしたりすることはできません
vectorとは異なり,配列全体の付与や複製は直接できないので注意が必要である.
もう一つ注意しなければならない問題があります.
int main()
{
    string strArray[2];
    
    strArray[0] = "volcanol";
    strArray[1] = "hi,";

    cout<<strArray[1]<<strArray[0]<<endl;

    return 0;
}

実行結果は次のとおりです.
[root@localhost cpp_src]# ./a.out 
hi,volcanol

   ここでは strArray[0]  全体的に文字列のフォント値を割り当てることができます.なぜなら、配列の下付きオペレータが左の値を返し、左の値を返すからです.
データ型はstringなので、全体的な割り当てができます.
    
配列はここまでですが、他にも配列に関するものがあります.