目次に戻る


このエントリーをはてなブックマークに追加


配列

「配列」という単語。

プログラマやITエンジニア以外の人にとってあまり聞きなれない単語である。
(いやでも生物とかで「塩基配列」とか言うか...)


プログラミングで使う"配列"というものは「データ構造」であり、最も簡単に例えるなら「中身が仕切りで区切られた細長い箱」
では実際にこの配列をC/C++での記述の仕方と使い方を見ていこう。

                    #include<iostrem>
                    using namespace std;

                    int main(){

                      int array[5] = { 1, 2, 3, 4, 5 };
                      //配列の宣言 配列も型がある

                      cout << "arrayの1つ目の要素は : " << array[0] << endl;
                      cout << "arrayの5つ目の要素は : " << array[4] << endl;

                      return 0;

                    }
                    
出力:
arrayの1つ目の要素は : 1
arrayの5つ目の要素は : 5

このように配列は名前の後ろに[ 要素数 ]を付ける。

その後ろに { } を使って配列の中身を初期化できる。


次にその配列の中身の使い方なのだが、これがまた少しややこしい。

上のソースを見てわかるように、1番目の要素を取り出すときは配列の0番目を指定している。
つまり、配列をarray[5]のように5つ確保した場合、使えるのはarray[0] ~ array[4]の5つである。


しかし…
初心者や経験者が array[5] に、ついうっかりアクセスしてしまうミス はよく見かける。
(というより誰もが一度は通る道なのではないだろうか...)

そうすると「セグメンテーション違反」「Segmentation fault」というエラーが出たり、予期していない値に振り切ってしまう

for文の中で以下のような配列の使い方を良くみるが、この形でセグメンテーション違反を起こすことが多い。


                        #include<iostrem>
                        using namespace std;

                        int main(){

                          int array[5] = { 1, 2, 3, 4, 5 };
                          //配列の宣言 配列も型がある

                          // ( int i = 0; i <=5; i++ )としてしまうと
                          // array[5]にアクセスしてしまいエラー(セグメンテーション違反)
                          for( int i = 0; i < 5; i++ )
                            cout << "array[" << i << "] = " << array[i] << endl;

                          return 0;

                        }

                    
出力:
array[0] = 1
array[1] = 2
array[2] = 3
array[3] = 4
array[4] = 5




2次元配列

配列は2次元構造のすることができる。

...と言われてもあまりよくわからないと思うので、行列(ベクトル)を例にして解説していく。


(どうやら最近の数IIIでは行列を扱っていないらしいが特に難しい計算はしないのでスルーします)


以下のような行列が2つあったとしよう!

a3


こいつらをC++で実装するとなるとこんな感じ...


                        #include<iostrem>
                        using namespace std;

                        int main(){

                          //行列(1)
                          int matrix_1[3] = { 2, 9, 4 };

                          //行列(2)
                          int matrix_2[3][3] = { { 2, 1, 4 },
                                                 { 0, 6, 3 },
                                                 { 4, 1, 9 }
                                                };

                          for( int i = 0; i < 3; i++)
                            cout << "行列(1)の" << i+1 << "番目要素は" << matrx_1[i] << endl;
                          cout << endl;

                          for( int = 0; i < 3; i++ ){
                            for(int j = 0; j < 3; j++){
                              cout << "行列(2)の" << i+1 << "行" << j+1 << "列要素は" << matrix_2[i][j] << endl;
                            }
                          }

                          return 0;

                        }
                    

出力:
行列(1)の1番目要素は2
行列(1)の2番目要素は9
行列(1)の3番目要素は4

行列(2)の1行1列目要素は2
行列(2)の1行2列目要素は1
行列(2)の1行3列目要素は4
行列(2)の2行1列目要素は0
行列(2)の2行2列目要素は6
行列(2)の2行3列目要素は3
行列(2)の3行1列目要素は4
行列(2)の3行2列目要素は1
行列(2)の3行3列目要素は9
行列(1)はともかく行列(2)のように、配列は多次元にすることが可能だ。
もちろん3次元配列 arraay[5][5][5] なんてこともできるが、最大何次元までいけるかはわからない(笑)

暇な人は使用メモリの少ないbool型とかで試してみてほしい。


スポンサーリンク



配列の使い方

配列は上記で紹介した初期化のほかにこのような使われ方が存在する。


                    #include<iostrem>
                    using namespace std;

                    int main(){

                      int array_1[] = { 0 , 1, 2, 3, 4, 5 };
                      //要素数を初期値の個数に勝手に合わせてくれる

                      cout << "array[2] = " << array[2] << endl;

                      int array_2[1000];

                      //要素数の多いものはfor文で初期化してしまう
                      for( innt i = 0; i < 1000; i++)
                        array_2[i] = 0;


                      return 0;

                    }

                    


配列で覚えておくことはこんなもんだろう。


注意してほしいのはarray[10]と宣言しておいて、弄れるのはarray[3]のように配列の番号を指定してしか扱えない。
つまりarray自体をどうこうできるわけではないので注意。

次回も配列の話だがちょっと別の方法で実装する。

みんなが最初につまずくポインタのお話…。



次回、 9, 配列を使ってみる・その2【ポインタ】



スポンサーリンク






このエントリーをはてなブックマークに追加