配列
ここでは、複数の値を格納できる変数である、配列について解説します。
スポンサーリンク
配列
複数の値を一つの変数名で表現したい場合には、配列を使用します。
配列を宣言するには、以下のように記述します:
ここで要素数は、配列に格納できる値の個数を指定します。なお、以下のように変数型の部分に要素数を付ける記述も可能です。
これら2 通りの宣言方法は、どちらも全く同じ処理となります。
例として、int 型の値を格納する配列を用意してみましょう:
または、
とします。これで5 つの整数値を格納できる配列が用意できました。
配列に値を代入したり、呼び出したりするには、変数名の右に [ インデックス番号 ] をつけて、 普通の変数と同じように行う事が可能です:
- 実行結果 -
これを実行すると 1 が表示されます。つまりa の中の、3 番目の要素に値を格納したわけです。
インデックス番号は、配列の要素に割り振られる番号で、 0 番から(要素数-1)番までが用意されています。要素数番まででは無い事に注意してください。 例えば、上の例では0,1,2,3,4 番までが用意されており、5 番は存在しません。
配列はその用途から、繰り返しの制御構文と併用される事が多いでしょう。 例として、0 から10 までの整数の2 乗を、配列に格納してみましょう:
- 実行結果 -
これを実行すると 64 が表示されます。
配列同士の代入
配列のインデックス番号を指定せずに、配列名のみを用いて代入を行った場合は、配列の全要素が代入されます。
- 実行結果 -
このプログラムを実行すると2 が表示されます。
要素数の異なる配列を代入する場合には、少し注意が必要です。 そういった場合、代入先の配列の要素数が変更され、代入したものと同じになります。
- 実行結果 -
このプログラムを実行すると、結果は「 2 」が表示されます。そして、a の要素数は20 になります。
ところで、多くのC言語系の他言語では、配列は参照型であり、代入先と代入元の変数は、同一の変数のように振舞うようになります(同じデータ領域を参照するようになる)。この場合、代入後に行った、代入先の配列に対する変更が、代入元の配列にも反映されます。
一方、VCSSLでは配列も値型であり、代入は単純に、全要素値のコピーとなります。同じデータ領域を参照するようにはなりません。従って、代入後に、代入先の配列に対して変更を加えても、それは代入元の配列に反映されません。
VCSSLは基本的に、C言語系の他言語となるべく同じ要領で扱えるようになっていますが、この違いについては注意が必要です。
多次元配列
配列は、インデックスを複数付ける事もできます。これを多次元配列と呼びます。
多次元配列の宣言・使用方法は1 次元の場合と基本的に同じで、 [ ] を複数付けるだけです:
- 実行結果 -
これを実行すると 16 が表示されます。
上の例のa は2 次元の配列ですが、 [ ] の数を増やすだけで何次元でも利用可能です。
配列の要素数を取得する
プログラムの実行中に、配列の要素数を調べたい場合はよくあります。そういう場合には、length 関数を使用します。
length 関数は、配列の指定された次元の要素数を調べて、結果をint型で返します。 最初の引数に配列変数を、続く引数に次元を指定します。 次元の指定は、配列の左から 0 次元目, 1 次元目, 2 次元目, ...と数えます。
- 実行結果 -
これを実行すると 3 が表示されます。 これは a の左端から数えた2 番目(0, 1, 2 と数える)、つまり右端の次元の要素数です。 同様にlength( a, 0 )は 1 を、length( a, 1 )は 2 を返します。
なお、 array 関数で 2 つめの引数を省略すると、各次元の要素数をまとめた配列が返されます。
上の例では、length(a) とすると、要素数3 のint 配列が返されます。 しかし、この機能は古い互換性維持のためのもので、配列の次元を右から 0, 1, 2 と数える仕様となっているため、混同を招くという問題があります。
従って、length 関数で2つめの引数を省略するのは、現在では非推奨となっています。
配列の要素数を変更する
配列の要素数を変更したい場合は、alloc 演算子を使用します。この演算子は使用方法が特殊で、以下のように使用します:
alloc[要素数][要素数]...[要素数] 配列変数 ; //多次元
このように記述すると、配列変数の要素数が、alloc の後の[ ] 内に記述した要素数に変わります。
具体的に使用してみましょう。以下のように記述し、実行してみてください:
- 実行結果 -
これを実行すると 20 が表示されます。 このように、alloc 演算子によって、配列変数a の要素数を、10 から20 に変更できました。
なお、allocの前後では、配列の各要素の値は維持されます。 つまり、もし上でa[ 1 ] に最初255が入っていたとすると、 alloc 後のa[ 1 ] も255 のままです。多次元の場合でも同様で、 同じインデックスに対応する要素は、同じ値に保たれます。
要素数1の配列を、配列でない変数に代入する
配列を、配列でない普通の変数に代入する事は、一般にはできません。
しかし例外があります。それは配列の要素数が1 の場合です。 要素数が1 の配列は、データ的には普通の変数と変わらないので、普通の変数へ代入する事ができます:
- 実行結果 -
上の例を実行すると 1 が表示されます。
配列の全要素に対する代入と演算
配列の全要素に同じ値を代入したい場合、
といった処理が可能です。例えば、
- 実行結果 -
これでi の全要素に1 が代入されます。
また、配列の全要素に、同じ値で同じ演算を行いたい場合は、以下のような略記も可能です:
- 実行結果 -
上の処理では、i の全要素に2 が加算され、3 となります。