以下で、4 つの整数を記憶する変数と配列を比べてみます。
変数を4個 | 4 つの要素を持つ配列 |
---|---|
int a1; /*宣言 */ int a2; int a3; int a4; a2 = 824; /* a2に824を記憶させる実行*/ |
int a[4]; /*宣言 */ a[2] = 824; /* a[2]に824を記憶させる実行*/ |
変数なので、単に変数名の一部に数字
を付けているだけ!! |
a[0] 、a[1]、a[2]、a[3] と使える変数を
用意したと考えると分かりやすい。 |
右記の配列において各a[0] 、a[1]、a[2]、a[3]の表現は、配列の要素と呼ばれます。
また、ここで各要素を指定している番号0、1、2、3 を添え字(そえじ)またはインデックス(index)と
言います。
例えば、a[0] = 123 の表現を実行すると、a の配列の0 の添え字要素(⇒先頭要素)を123 に変更できます。
a[3] + 99 の表現で、3の添え字で指定される要素の記憶内容と、99 を加算した結果が求めら
れます。
これは、a[2+1] + 99 のように、[ ]の中を式で表現しても構いません。
なおこの例の場合、a[4]の表現を使うと、実行エラーが起きます。
なぜなら、この要素が存在しないからです。この例のint a[4]; /*宣言 */で
使える要素はa[0] 、a[1]、a[2]、a[3] の4つで、a[4]は存在しないのです。
これは、コンパイルエラーの指摘がないので、注意が必要です。
また、配列の要素は変数のように取り扱えるので、
scanf("%d" , & a[1])のような表現で入力でき、
++a[1] の実行で、a[1]の記憶内容を増やせます。
しかし、++a の表現や、a を=演算子で変更する表現はコンパイルエラーになります。
C 言語の配列は、同じ記憶サイズ(上記はint 型)の記憶領域を並べて用意することで実現して
おり、配列の名前はその記憶領域の先頭アドレス(ポインタと呼ばれるデータです。)を意味します。⇒
この記憶領域の先頭位置は、マシン語に翻訳される時点で決ってしまうので、それを表現している
配列名は変更できないものなのになります。
また、上記例のint a[4]; の、
要素数を指定している4の部分は、変数を指定することができません。
定数だけです。
mainなどの関数の中で int k; と宣言した場合、初期のkに記憶される値が決っていないのと同じように、
mainなどの関数の中で int b[5]; と宣言した場合、各要素の内容は、それぞれ何が記憶されるわかならい状態になっています。
そこで、一般に配列は初期で何かの値を設定することからプログラムするのが普通です。
以下は、配列bの5個の要素を、-1に設定しているプログラム例です。
配列を考える場合は、次のように記憶構造をイメージすることが大事です。
(アクセスしている要素をこの色で示す)