参照型の変数の考え方

広告

配列変数は参照型と呼ばれる変数で基本のデータ型を使った変数とは少し取り扱い方が異なります。

基本データ型の変数の場合は、変数は値を格納する入れ物そのものです。よって変数と変数に格納されている値は同じように扱うことができます。それに対して配列のような参照型の変数では値を格納する入れ物は別に用意されます。そして参照型の変数には入れ物の位置が格納されることになります。

では配列を宣言してみます。

int n[];

配列変数には入れ物の位置が格納されますが、宣言しただけではまだ入れ物が用意されていません。よってこの時点ではnullという特別な値が配列変数に格納されています。nullはこのように参照型の変数にまだ適切な値が格納されていないことを表すために用意された定数です。

次にnew演算子を使って必要な数の要素を確保します。

int n[];
n = new int[5];

new演算子を使って5個の値が格納できる場所が確保されると同時に、確保された場所の先頭の場所の位置が配列変数に代入されます。この時点で初めて配列変数は有効な値を持つことになります。

このように配列変数そのものはあくまでどこかに確保された場所の位置だけを格納しています。配列に値を格納したり、値を取り出したりする場合は配列変数そのものではなく配列の各要素に対して行うことになります。(配列の要素の使い方は次のページで解説します)。

参照型で出てくる場所の位置という考え方はCやC++などのアドレスに似ていますが、Cのポインタのように直接操作することはできません。

参照型変数の値を代入

参照型の変数にはどこかに確保された場所の位置が代入されていますが、別に用意した参照型の変数に代入することもできます。

次の例を見てください。

int n[] = new int[3];
int m[];

m = n;

配列変数「m」に配列変数「n」を代入しています。この結果、どちらの配列変数も同じ場所の位置を持つことになります。このため、どちらの配列変数を使っても同じ要素に対して操作することができます。

通常の変数の場合には、元の変数の値が複製されて代入先の変数に格納されますが、配列を別の配列にコピーした場合は、元の配列が持っていた要素が複製されるわけではなく、まったく同じ要素に対して二つの配列を変数を使ってアクセスすることができるようになります。

サンプル

では簡単な例で試しておきます。

JSample3_1.java

class JSample3_1{
  public static void main(String args[]){
    int n[];
    int m[];

    n = new int[2];
    System.out.println(n);

    n[0] = 10;

    m = n;
    System.out.println(m);
    System.out.println("n[0] = " + n[0]);
    System.out.println("m[0] = " + m[0]);
  }
}

コンパイル後に実行すると次のように表示されます。

p3-1

今回は要素を確保した後の配列変数の値を画面に出力させてみました。この値そのものは特に利用できるものではありません。また別の配列変数を用意して代入しています。どちらの配列変数にも同じ要素の位置を持っていますので、どちらの配列変数を使っても同じ要素を参照することができます。

( Written by Tatsuo Ikura )

関連記事 (一部広告含む)