01 配列(array / table)

【知識】

同じ種類・同じ大きさのデータを連続して並べたデータ構造。各要素は添字(インデックス)で識別する。

一次元配列 A
A[1]10
A[2]20
A[3]30
A[4]40
A[5]50
添字(A[3])で、どこでも一発アクセスできる(ランダムアクセス・速い)
二次元配列 B(行 × 列)
B[1,1]
B[1,2]
B[1,3]
B[2,1]
B[2,2]
B[2,3]
行と列の2つの添字 [ 行 , 列 ] で位置を指定する
添字の書き方は2通りある。 角カッコ A[3]B[2,3] のほか、 丸カッコ A(3)B(2,3) で書く流儀もある(本資料でも問題により両方が登場する。意味は同じ)。 試験では出題文の書き方に合わせて読めばよい。2次元は [行, 列](行, 列) の順。

静的配列と動的配列

説明
静的配列要素数をあらかじめ決めておく。超えて格納できない
動的配列実行中に必要に応じてサイズを増やせる

【演習】理解度チェック

Q1(H28春 問6)★2次元配列の値の計算

2次元の整数型配列 a の各要素 a(i, j) の値は 2i + j である。 このとき、a( a(1,1)×2 , a(2,2)+1 ) の値はいくつか。

解説を表示

正解:エ(19)

内側の a( , ) から先に計算するのがコツ。定義 a(i,j) = 2i + j にそのまま代入するだけ。

  1. a(1,1) = 2×1 + 1 = 3
  2. a(2,2) = 2×2 + 2 = 6
  3. 式に代入:a(3×2, 6+1) = a(6, 7)
  4. a(6,7) = 2×6 + 7 = 19

▼速解法:関数のような入れ子は「一番内側の括弧」から順に数値に置き換える。焦らず1段ずつ。

過去問道場で確認

Q2(H27秋 問6)★2次元配列の要素の移動

配列 A を、ある規則で配列 B に移し替える流れ図がある。A(i,j) を B のどの位置へ移すと、B が「A を回転させた配置」になるか。
※図(配列の並び)は こちらで確認。

解説を表示

正解:エ

▼解き方:全部覚えるのは無理。具体的な1マスの座標を選択肢に代入して合うものを探す。
例)A の [3,1] が B の [1,4] に移るなら、i=3, j=1 を代入して B(1,4) になる式を選ぶ → B(j, 7−i) = B(1, 4)

過去問道場で確認(図・詳しい解説)

Q3 ★アドレス計算

先頭要素 A[0] が 1000 番地、1要素の大きさが 4 バイトの1次元配列がある。A[10] の先頭アドレスは何番地か。

解説を表示

正解:ウ(1040 番地)

アドレス = 先頭 + 添字 × 要素の大きさ = 1000 + 10 × 4 = 1040
配列が「連続して」並ぶからこの計算ができる(=ランダムアクセスが速い理由)。

ひっかけ:A[0] が先頭なので A[10] は「11 個目」だが、先頭からのずれ(オフセット)は添字 10 個ぶん。10×4=40 を足す。

▼ 解説つきの類題を探す:過去問道場・分野別「データ構造」

Q4 ★2次元配列のアドレス計算(行優先)

整数型(1要素 4バイト)の2次元配列 A[3][4](添字は 0 から)が、先頭 1000 番地から行優先(0行目を左から全部 → 1行目 → …の順)で連続格納されている。A[2][1] の先頭アドレスは何番地か。

配列 A[3][4](緑が A[2][1])
A[0][0]
A[0][1]
A[0][2]
A[0][3]
A[1][0]
A[1][1]
A[1][2]
A[1][3]
A[2][0]
A[2][1]
A[2][2]
A[2][3]
行優先の格納順は A[0][0], A[0][1] … A[0][3], A[1][0] … と数える。A[2][1] は先頭から 0 で数えて 9 番目
解説を表示

正解:イ(1036 番地)

先頭からのずれ(要素数)= 行 × 1行の列数 + 列 = 2 × 4 + 1 = 9
アドレス = 先頭 + ずれ × 要素の大きさ = 1000 + 9 × 4 = 1036

▼速解法:2次元配列のアドレスは「行×列数+列」で1次元の位置に直す → ×要素サイズ。図で「9番目」と数えれば確実。

ひっかけ:ウ 1040 は A[2][1] を「10番目」と1から数えた誤り(0 から数える)。ア 1020 は行と列を逆(列優先)にした場合。

▼ 解説つきの類題を探す:過去問道場・分野別「データ構造」


【練習リンク】