1次元配列を理解する

一次元配列は同じ型の複数の要素を添字で扱うオブジェクトです。配列変数と配列実体を区別し、生成、読取り、書換え、繰返し処理を一つずつ学びます。

この単元で学ぶこと

  • 配列変数の宣言と実体生成を区別する
  • 0始まりの添字で要素を読み書きする
  • 配列の参照共有と再代入を追う

本文解説

同じ型をまとめる int[] scores={60,80,90};は三つのint要素を持つ配列を作ります。scoresという一つの名前と添字で各得点を扱えます。int[]はintとは別の参照型であり、scoresへ整数60そのものを代入することはできません。

宣言と生成 int[] a;は配列参照変数の宣言だけです。a=new int[3];で三要素の配列を作り、その参照をaへ入れます。main内の宣言だけのaを読むと確定代入エラーです。a=null;なら初期化は済んでいますが要素を参照できる実体はありません。

添字は0から int[] a={4,7,9};でa[0]は4、a[1]は7、a[2]は9です。長さは3でもa[3]は範囲外です。何番目という日常表現では三番目が添字2になるため、一つずれる誤りに注意します。

要素を書き換える a[1]=20;は二番目の要素だけを20へ変えます。a[1]++;ならその要素を一つ増やします。配列全体の再代入ではなく、参照先の一要素の変更です。ほかの要素の値と配列の長さは変わりません。

長さは固定 new int[3]で生成した実体のlengthは3で変えられません。a=new int[5];なら長さ5の別配列へ参照を付け替えます。前の三要素を自動的に引き継ぐ拡張ではありません。必要なら要素を明示的にコピーします。

ループで全要素を読む for(int i=0;i<a.length;i++){sum+=a[i];}はすべての有効添字を使います。拡張for(int x:a){sum+=x;}でも各要素の値を順に読めます。添字が不要な集計は拡張for、位置を使う更新は基本forが読みやすい場合があります。

参照の共有 int[] a={1,2};int[] b=a;では二つの変数が同じ配列を指します。b[0]=9;を行えばa[0]も9です。b=new int[]{8};ならbだけを別実体へ付け替え、aが指す元配列の要素は変わりません。

拡張forの変数 for(int x:a){x=0;}は各要素を読み込むローカル変数xへ再代入するだけで、配列の要素は変わりません。配列自体を0にしたいならa[i]=0のように要素へ代入します。値を受け取る変数と配列内の格納場所を区別します。

図解

参照と三つの要素
最後の添字はlength-1であり、lengthそのものではない。

重要ポイント

  • int[]はint要素の配列への参照型。
  • 長さnの有効添字は0からn-1。
  • 生成後に同じ配列実体の長さは変わらない。
  • 参照を代入しても配列の全要素をコピーしない。

間違えやすい点

  • int[] a;だけで要素が作られると思わない。
  • lengthを最後の有効添字として使わない。
  • 拡張for変数の再代入を配列要素の書換えと思わない。

用語解説

要素
配列内の各値を格納する変数。
添字
0から始まる要素の位置を指定する整数。
配列変数
配列オブジェクトへの参照を格納する変数。

関連教材

参考資料

教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。

確認問題の出題・採点や学習履歴の保存にはログインが必要です。