配列とは? わかりやすく解説

はい‐れつ【配列/排列】

読み方:はいれつ

[名](スル)順序決めて並べること。また、その並び。「五十音順に—する」

(「配列」と書く)コンピュータープログラミング言語における、データ形式の一。同じ型のデータ集合意味し個々データ変数添え字区別する

「配列」に似た言葉

配列 連想配列

【同】 連想配列
【英】 Array,Associative Array

データ並べたデータ形式で、ほとんどのプログラミング言語存在する基本的な形式のひとつ。配列に含まれるそれぞれのデータ要素といい、キーによって識別される

PHP場合は、キーとして数字だけでなく文字列も取ることができ、特にその場合の配列を連想配列と呼ぶ。


配列

読み方はいれつ
【英】array

配列とは、プログラムで扱うデータ構造において、同じ長さデータ並べたのである一般的には、配列に格納できるデータ個数はあらかじめ決めておく場合が多い。

配列内のデータは、先頭からの順番指定する先頭順番を1から始めるか、0からは始めるかは、プログラム言語により異なる。

配列は、扱いやすいデータ構造であるといわれている。ただし、いったん配列にデータ格納したあとで、途中データ挿入する場合、あるいは、配列からデータ削除する場合には、データ移動する必要がある

プログラミングのほかの用語一覧
コーディング:  オーバーフロー  オーバーロード  打ち切り誤差  配列  バグ  パラメータ  パーサ

配列関数(array)

導入

これらの関数により様々な手法で配列にアクセスし、操作することが可能 になります。配列は、変数の組を保存、管理、操作する基本的な要素です。
通常の配列および多次元配列がサポートされており、ユーザが定義したり、 他の関数で作成することも可能です。いくつかのデータベース処理関数は、 データベースのクエリから配列を返しますし、いくつかの関数は配列を返 します。
PHPでの配列の実装や使用方法の詳細については、マニュアルの 配列に関する節を参照下 さい。 その他の配列の操作方法については、 配列演算子も 参照ください。

要件

外部ライブラリを必要としません。

インストール手順

PHP コアに含まれるため、 追加のインストール無しで使用できます。

実行時設定

設定ディレクティブは定義されていません。

リソース型

リソース型は定義されていません。

定義済み定数

以下の定数は、PHP コアに含まれており、常に利用可能です。
CASE_LOWER (integer)
CASE_LOWERは、 array_change_key_case()で使用され、 配列のキーを小文字に変換するために使用されます。小文字は、 array_change_key_case()のデフォルトのケースで もあります。
CASE_UPPER (integer)
CASE_UPPERは、 array_change_key_case()で使用され、配列のキー を大文字に変換するために使用されます。

ソース順のフラグ:
SORT_ASC (integer)
SORT_ASCは、 array_multisort()でソート順を昇順にするために 使用されます。
SORT_DESC (integer) (integer)
SORT_DESCは、 array_multisort()でソート順を降順にするために 使用されます。

ソート型のフラグ: 種々のソート関数で使用されます
SORT_REGULAR (integer)
SORT_REGULARは通常の比較するために使用され ます。
SORT_NUMERIC (integer)
SORT_NUMERICは数値で比較を行うために使用さ れます。
SORT_STRING (integer)
SORT_STRINGは文字列として比較を行うために使 用されます。
SORT_LOCALE_STRING (integer)
SORT_LOCALE_STRINGは現在のロケールに基づいた 文字列として比較を行うために使用されます。 PHP 4.4.0と5.0.2で追加 されました。

COUNT_NORMAL (integer)
COUNT_RECURSIVE (integer)
EXTR_OVERWRITE (integer)
EXTR_SKIP (integer)
EXTR_PREFIX_SAME (integer)
EXTR_PREFIX_ALL (integer)
EXTR_PREFIX_INVALID (integer)
EXTR_PREFIX_IF_EXISTS (integer)
EXTR_IF_EXISTS (integer)
EXTR_REFS (integer)

参考

is_array(), explode(), implode(), split(), preg_split(), および join() も参照してください。

目次

array_change_key_case — 配列のキーを全て小文字または大文字にして返す
array_chunk — 配列を分割する
array_combine — 一方の配列をキーとして、もう一方の配列を値として、ひとつの配列を生成する
array_count_values — 配列の値の数を数える
array_diff_assoc — 追加された添字の確認を含めて配列の差を計算する
array_diff_key — キーを基準にして配列の差を計算する
array_diff_uassoc — ユーザが指定したコールバック関数を利用し、 追加された添字の確認を含めて配列の差を計算する
array_diff_ukey — キーを基準にし、コールバック関数を用いて配列の差を計算する
array_diff — 配列の差を計算する
array_fill_keys — キーを指定して、配列を値で埋める
array_fill — 配列を指定した値で埋める
array_filter — コールバック関数を使用する配列要素フィルタ
array_flip — 配列のキーと値を反転する
array_intersect_assoc — 追加された添字の確認も含めて配列の共通項を確認する
array_intersect_key — キーを基準にして配列の共通項を計算する
array_intersect_uassoc — 追加された添字の確認も含め、コールバック関数を用いて 配列の共通項を確認する
array_intersect_ukey — キーを基準にし、コールバック関数を用いて 配列の共通項を計算する
array_intersect — 配列の共通項を計算する
array_key_exists — 指定したキーまたは添字が配列にあるかどうかを調べる
array_keys — 配列のキーをすべて返す
array_map — 指定した配列の要素にコールバック関数を適用する
array_merge_recursive — 二つ以上の配列を再帰的にマージする
array_merge — ひとつまたは複数の配列をマージする
array_multisort — 複数の多次元の配列をソートする
array_pad — 指定長、指定した値で配列を埋める
array_pop — 配列の末尾から要素を取り除く
array_product — 配列の値の積を計算する
array_push — 一つ以上の要素を配列の最後に追加する
array_rand — 配列から一つ以上の要素をランダムに取得する
array_reduce — コールバック関数を用いて配列を普通の値に変更することにより、 配列を再帰的に減らす
array_reverse — 要素を逆順にした配列を返す
array_search — 指定した値を配列で検索し、見つかった場合に対応するキーを返す
array_shift — 配列の先頭から要素を一つ取り出す
array_slice — 配列の一部を展開する
array_splice — 配列の一部を削除し、他の要素で置換する
array_sum — 配列の中の値の合計を計算する
array_udiff_assoc — データの比較にコールバック関数を用い、 追加された添字の確認を含めて配列の差を計算する
array_udiff_uassoc — データと添字の比較にコールバック関数を用い、 追加された添字の確認を含めて配列の差を計算する
array_udiff — データの比較にコールバック関数を用い、配列の差を計算する
array_uintersect_assoc — データの比較にコールバック関数を用い、 追加された添字の確認も含めて配列の共通項を計算する
array_uintersect_uassoc — データと添字の比較にコールバック関数を用い、 追加された添字の確認も含めて配列の共通項を計算する
array_uintersect — データの比較にコールバック関数を用い、配列の共通項を計算する
array_unique — 配列から重複した値を削除する
array_unshift — 一つ以上の要素を配列の最初に加える
array_values — 配列の全ての値を返す
array_walk_recursive — 配列の全ての要素に、ユーザー関数を再帰的に適用する
array_walk — 配列の全ての要素にユーザ関数を適用する
array — 配列を生成する
arsort — 連想キーと要素との関係を維持しつつ配列を逆順にソートする
asort — 連想キーと要素との関係を維持しつつ配列をソートする
compact — 変数名とその値から配列を作成する
count — 変数に含まれる要素、 あるいはオブジェクトに含まれるプロパティの数を数える
current — 配列内の現在の要素を返す
each — 配列から、次のキーと値のペアを返す
end — 配列の内部ポインタを最終要素にセットする
extract — 配列からシンボルテーブルに変数をインポートする
in_array — 配列に値があるかチェックする
key — 連想配列からキーを取り出す
krsort — 配列をキーで逆順にソートする
ksort — 配列をキーでソートする
list — 配列と同様の形式で、複数の変数への代入を行う
natcasesort — 大文字小文字を区別しない"自然順"アルゴリズムを用いて配列をソートする
natsort — "自然順"アルゴリズムで配列をソートする
next — 内部配列ポインタを進める
poscurrent() のエイリアス
prev — 内部の配列ポインタをひとつ前に戻す
range — ある範囲の整数を有する配列を作成する
reset — 配列の内部ポインタを先頭の要素にセットする
rsort — 配列を逆順にソートする
shuffle — 配列をシャッフルする
sizeofcount() のエイリアス
sort — 配列をソートする
uasort — ユーザー定義の比較関数で配列をソートし、連想インデックスを保持する
uksort — ユーザー定義の比較関数を用いて、キーで配列をソートする
usort — ユーザー定義の比較関数を使用して、配列を値でソートする

配列

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2024/12/17 17:42 UTC 版)

この記事では、コンピュータ・プログラムにおいて配列(はいれつ、: array)と呼ばれているデータ構造およびデータ型について説明する。計算機科学の分野ではベクトルと呼ぶ場合もある。また、リストも参照。一般に、添え字(インデックス)で個々の要素を区別する。

配列とは

複数の要素(値)の集合を格納・管理するのに用いられるデータ構造が配列である。数学のベクトルおよび行列に近い概念であり、実際にベクトルおよび行列をプログラム上で表現する場合に配列が使われることが多い。同様に複数要素の集合を管理するデータ構造(コレクションあるいはコンテナ)には連結リストハッシュテーブルなどがあるが、通常はメモリアドレス上での連続性の違いなどから配列とは区別される。1次元の配列は特に線形配列 (linear array) とも呼ばれる。通例、配列のデータ領域はメモリ空間上で連続していることから、他のデータ構造と比べて空間効率が高く、隣接するデータがまとめてプロセッサのキャッシュに載りやすいという特徴を持つ。

C言語C++のような静的型付け言語における配列は、連続したメモリ領域を占有する、同じデータ型のオブジェクト[注釈 1]のシーケンス(並び)である[1]。ある型Tの配列に、Tとは異なるデータ型のオブジェクトを直接格納することはできないが、ポインタやスマートポインタを要素型とする配列を利用することで、間接的に異なるデータ型のオブジェクトを含む配列を実現することができる。JavaC#といった言語では、何らかの参照型の配列を利用することで、任意の派生型(サブクラス)のオブジェクトを含む配列を実現することができる。

一方、JavaScriptのような動的型付け言語では、変数ではなく値自身が型を持ち、配列にはあらゆるデータ型の値を格納することができるが、内部的には共通の基底オブジェクトへの参照を要素型とすることによって実現されている。これは柔軟性と引き換えに速度や空間効率といったパフォーマンスや保守性などを低下させてしまう。そのため、あえて特定の型しか格納することのできない型付き配列をサポートする動的言語もある[2][3]

配列を第一級オブジェクトとして扱うかどうかは言語によって異なる。C/C++の言語組み込み配列(Cスタイル配列)は第一級オブジェクトではなく、構造体やクラスでラップすることによって疑似的な第一級オブジェクトとすることが多い(C++11以降で標準化されたstd::arrayクラステンプレートなど)。一方、Javaの配列はjava.lang.Objectクラスから派生する第一級オブジェクトである[4]

文字列は文字の配列によって実現される。文字列の具体的な実装は言語やエンコーディング方式によっても異なる。Cの文字列は配列中のヌル文字を使って終端を表すヌル終端文字列であり、また第一級オブジェクトではない。C++の標準ライブラリでは、C文字列との相互運用性を持つ可変長文字列クラステンプレートstd::basic_stringが規定されている。一方、Javaの文字列は変更不可能(イミュータブル)なUnicodeUTF-16)文字配列によるバッファと長さを併せて管理するjava.lang.Stringクラスのインスタンスであり、また第一級オブジェクトである。

簡単な例

ここでは例示にC言語 (C99) を使う。

例えば、6人の生徒の平均点を計算するプログラムを書くとする。配列を使わない方法では、それぞれの生徒に対応する変数を、次のように個別に用意することだろう。

int score1;
int score2;
int score3;
int score4;
int score5;
int score6;
// 例えば標準入力経由で各生徒の得点を各変数に読み込んだとする。
double mean = (double)(score1 + score2 + score3 + score4 + score5 + score6) / 6;

しかし、この方法では生徒数が増減したときに、変更や拡張が大変になってしまう。より良い解は6要素の配列を使うことである。

int score[6]; // 6要素の配列が作られる。
// 例えば標準入力経由で各生徒の得点を配列scoreに読み込んだとする。
double mean = 0;
for (int i = 0; i < 6; ++i) {
  mean += score[i]; // 配列の各要素へは、変数scoreを通してscore[0]からscore[5]のようにしてアクセスする。
}
mean /= 6;

配列を用いることで、添え字演算子 (array subscript operator[5]) による統一的なアクセスおよび一括処理が可能となる。また、処理すべきデータ個数が増減したときにも対応しやすくなる。

配列の動的確保

前述の例では、プログラム中で宣言時に指定した固定のサイズ(整数定数)による配列確保(静的確保)であった。実用的には、配列の要素数が宣言時(あるいはコンパイル時)に静的に決まってしまうよりも、実行時に要素数を動的に指定して配列を確保できたほうが便利なことがある。例えば、縦横任意サイズの画像ファイルから全画素情報を読み出す場合や、コンピュータで利用可能な空きメモリ量に合わせて扱うデータ個数上限を変化させたい場合などである。

多くのプログラミング言語では、配列のサイズをプログラム実行時に指定して配列を生成する(動的に確保する)手段が用意されている。例えばC言語ではmalloc関数やcalloc関数を利用する。確保に成功するとメモリブロック(配列先頭要素)へのポインタが返却され、このポインタ経由で配列を操作する。

int numStudents;
// 例えば標準入力経由でnumStudentsに生徒数 (> 0) を読み込んだとする。
int* score = calloc(numStudents, sizeof(int)); // 要素数がnumStudents、各要素のサイズがint型のサイズであるような配列を動的に確保し、0で初期化する。
// 例えば標準入力経由で各生徒の得点を配列scoreに読み込んだとする。
double mean = 0;
for (int i = 0; i < numStudents; ++i) {
  mean += score[i]; // 動的に確保した場合でも、配列の添え字シンタックスは同じ。
}
mean /= numStudents;
free(score); // 使い終わった配列のメモリ領域を解放する。

C++などの後発の言語では、動的メモリ確保のために通例new演算子が用意されていることが多く、配列の動的確保には型と要素数を指定するnew[]演算子を使用する。

int numStudents;
// 例えば標準入力経由でnumStudentsに生徒数 (> 0) を読み込んだとする。
int* score = new int[numStudents](); // 要素数がnumStudentsであるようなint型の配列を動的に確保し、0で初期化する。
// 例えば標準入力経由で各生徒の得点を配列scoreに読み込んだとする。
double mean = 0;
for (int i = 0; i < numStudents; ++i) {
  mean += score[i]; // 動的に確保した場合でも、配列の添え字シンタックスは同じ。
}
mean /= numStudents;
delete[] score; // 使い終わった配列のメモリ領域を解放する。

いずれにせよ、C/C++ではmallocあるいはnewによってヒープ領域から確保したメモリは明示的に解放する必要があり、解放を忘れるとメモリリークの原因となる。プログラミングの煩雑さを解消するため、C++ではコンストラクタデストラクタを使ったメモリ寿命管理手法 (RAII) が使われることが多い。Javaなどの後発の言語ではガベージコレクションによる自動解放を導入していることが多く、また配列の確保に関して静的確保・動的確保といった区別をしない(配列の確保はすべて動的確保である)ことが多い。

通例、上記のようにして「動的に確保された配列」は、後述の「動的配列」とは異なり、要素の追加時に自動的にサイズを増加させるようなことはできない。

なお、C言語には後述する可変長配列も言語機能として備わっているが、メモリの生存期間などの面で違いがある。

計算量

「配列」という語は、抽象データ型というよりも、添え字をオフセットとしてメモリのアドレスにマップすることで、定数時間(ランダウの記号を用いてO(1)と書かれる)でアクセスできる具象あるいは実装を特に指す場合がある(その意味では、次節の連想配列などは「配列」ではない、ということになる)。

配列に要素を挿入/削除する際、要素間に「隙間」が無いようにするには、線形リストと異なり、挿入/削除位置から後ろの領域にあるすべてのデータの移動(コピー)が必要となる。そのため、挿入/削除にかかる時間はO(n)となる。さらに配列は連続領域を必要とするため、挿入時に領域が不足した場合に拡張する際のメモリ再確保のコストが高い。

探索は一般的には線型探索になるためO(n)だが、データがソート済みであれば二分探索を使うことでO(log n)に軽減することもできる(抽象データ型としては、sorted array などの名前で別のデータ構造と考える場合もある。en:Sorted array を参照)。

さまざまな配列

連想配列

一般的な配列の添え字(インデックス)は整数型であり、有効な値は0または1始まりの非負整数値である。配列の要素数をnとしたとき、とりうる値の範囲は、0始まりの場合は[0, n - 1]、1始まりの場合は[1, n]となる。一方、負数あるいは浮動小数点数を含む任意の数値型や、文字列あるいはユーザー定義の任意のデータ型などを添え字のように使用できる配列を連想配列という。連想配列のインデックス値は連続している必要はなく、飛び飛びであってもかまわない。

静的配列

決まった要素数しか格納できない配列を、静的配列 (static array) あるいは固定長配列 (fixed-length array) と呼ぶ[6]。変数の宣言時あるいはオブジェクト構築の際に長さ(要素数)を指定し、以降は要素を追加あるいは削除することができない。この文脈における「静的」および「固定長」とは、配列の確保時に要素数が決まり、以降は変化しないという意味であり、メモリ確保が静的であるかどうか(記憶域期間が静的であるかどうか)、また要素数が静的に決まるかどうか(要素数がコンパイル時定数であるかどうか)ということは無関係である。JavaC#の言語組み込みの配列は常にヒープ領域に動的メモリ確保され、また確保する際に指定する要素数にはコンパイル時定数だけでなく動的に値が決まる変数も使用できるが、確保した後は要素の追加や削除ができない静的配列である。

動的配列

長さが固定的に決まっておらず、実行時に必要に応じて要素を追加あるいは削除できる配列を、動的配列 (dynamic array) あるいは可変長配列 (variable-length array) と呼ぶ[7]。メモリが許す限り、要素の末尾追加や途中挿入がいくらでもできる。標準ライブラリで提供されるもの(C++std::vector[8]Javajava.util.ArrayList.NETSystem.Collections.Generic.List[9][注釈 2]など)と、言語に組み込まれているもの(PerlDJavaScript[10]Pythonlist[11]など)がある。またPerlなど、言語によっては、最初に配列を生成する際に指定されたサイズからはみ出してアクセス(範囲外アクセス)しても、自動的に拡大されるような配列を持っているものもある。

Visual BasicVisual Basic for Applications (VBA)、Visual Basic .NET (VB.NET) では、配列をReDimステートメントによって後からリサイズすることができる[12][13]。そのため、可変長配列 (variable length array) とも呼ばれている[14]。リサイズ時に配列内の既存のデータ内容を維持したままにするにはオプションとしてPreserveキーワードを付ける。FreeBASICでも同様の可変長配列がサポートされている[15][16]

一般的に動的配列は内部的には静的配列により実装されているものであり、最初にある程度余裕を持たせた領域を確保しておいて、足らなくなった場合は新しい領域を確保してそこにデータを移し替えることで実現されている。ジェネリックプログラミングをサポートする言語では、任意のデータ型を要素型とする動的配列をサポートするが、そのようなコンテナ(コレクション)を必要に応じてユーザー定義することもできる。特にC++はテンプレートおよび演算子オーバーロードをサポートするため、組み込みの配列型と同じ記法を模倣したクラス型をユーザー定義しやすく、std::vectorに類似の機能を持つクラス型を自前で実装しているライブラリもある[17][18][19]

動的配列の拡大などの場合には、最悪の場合、メモリ上の別の場所が確保されて、そこに全体をコピーする、というような時間のかかる操作が起きる可能性があるものもある(そのシステムの設計次第で、配列の内部にあるものが他からポインタで指されていて、それを更新できないなど、そういうことができない場合もある[要説明])。最悪ではなく償却計算量でO(n)にならなければ良い、という考え方もある。[要説明]

Cの可変長配列

C言語では、下記のように、実行時に(整数定数式ではない)要素数を指定して自動変数として確保することのできる静的配列を可変長配列 (variable-length array, VLA) と呼んでいる[20][21]GCCに拡張として実装されていたが、C99以降で標準化された。Cの可変長配列は動的配列ではなく、後から要素を追加したり削除したりすることはできない。また、静的記憶域期間を持つ配列の要素数は、従来通りコンパイル時定数でなければならない。C11以降では、VLAは必須機能ではなくオプション機能に格下げとなっている。

void func(size_t n) {
  int data[n];
}

Linuxなどの一部の環境では、言語組み込みの機能ではなくランタイムライブラリによって同等の機能を提供するalloca()関数がサポートされている[22]Microsoft Visual C++では言語組み込みの機能としてはサポートされていないが、ランタイムライブラリに_alloca()関数が用意されている[23]

Cの可変長配列は指定されるサイズが小さい場合に限って利用すべきである。自動変数は通例スタック領域に確保されるため、うかつに大きなサイズを指定するとスタックオーバーフローを引き起こす危険性がある。

多次元配列

1次元だけではなく2次元・3次元などの多次元配列 (multidimensional array) を備える言語もある。 マトリックスやグリッドのような矩形構造を持ったデータ構造であることから、矩形配列 (rectangular array) と呼ばれることもある[24]

C#FORTRANなど、一部の言語には「真の」多次元配列があり、a[i, j] などといったような構文でアクセスする。

C#による多次元配列の例を示す。

int[,] array2d = {
  {0, 1, 2, 3},
  {4, 5, 6, 7},
  {8, 9, 10, 11},
};
System.Console.WriteLine(array2d[2, 3]);

C#には、後述するジャグ配列となる「配列の配列」もある。

C言語の場合

C言語は規格で多次元配列に関する言及があるが、実際にサポートされているのは「配列の配列」であって、真の多次元配列ではない[25]。次のようなコードのことを考えてみればわかる。

void f(int (*p_arr3)[3]) {
  ……
}

int main(void) {
  int arr5_arr3[5][3];
  f(arr5_arr3);
  return 0;
}

ここで arr5_arr3 は「『intの3要素の配列』の5要素の配列」である。そして、関数fに渡される際には、C言語の「配列は引数として渡される際は、その先頭要素を指すポインタに縮退する」というルールにより、その先頭の「intの3要素の配列」を指すポインタがp_arr3に渡される。

もし仮にC言語で真の多次元配列がサポートされているならば、それぞれ「intの5x3要素の配列」「『intの5x3要素』を指すポインタ」(あるいは、単にintを指すポインタに縮退するかもしれない)などがサポートされるはずだが、実際にはサポートされない。

Javaの場合

Javaの「配列の配列」はC言語よりもさらに緩く、Javaの型システムにおける「配列の配列」では、外側の配列は、内側の配列のサイズを固定しない(C言語では、内側の配列のサイズは固定である)。さらに、Javaにはプリミティブ型と参照型があり、参照型は一種のポインタだが、配列は参照型であるので、Javaの「配列の配列」は後述の「ジャグ配列」になっており、やはり真の多次元配列がサポートされているとは言えない。もちろん、1次元配列に対し多次元配列風にアクセスする機能を提供するようなクラスを実装することはできるが、それでは言語レベルで真の多次元配列がサポートされているとは言えない。


ジャグ配列

ジャグ配列のイメージ

「配列の配列」の場合、内側の配列について、要素数が揃っていることを要求しないデータ構造であることもある。ジャグ配列 (jagged array)、不規則配列などと言う。これに対し、内側の配列の要素数が揃った配列を矩形配列 (rectangular array) などと言う。Javaにおける配列の配列はジャグ配列である。C#には前述の通り、「真の多次元配列」もあるが、それとは別に配列の配列もあり、そちらはJavaと同様のジャグ配列である。

Javaによるジャグ配列の例を示す。

int[][] numArr = new int[3][];
numArr[0] = new int[]{1, 2, 3};
numArr[1] = new int[]{4, 5, 6, 7};
numArr[2] = new int[]{8, 9};
System.out.println(numArr[1][1]);

C#によるジャグ配列の例を示す。

int[][] numArr = new int[3][];
numArr[0] = new int[]{1, 2, 3};
numArr[1] = new int[]{4, 5, 6, 7};
numArr[2] = new int[]{8, 9};
System.Console.WriteLine(numArr[1][1]);

要素のアドレスを指定するための参照の展開は、ジャグ配列では次元の数だけ必要なのに対し、矩形配列では1回で済む。また配列の領域を確保する際、ジャグ配列では次元ごとに領域確保を繰り返す必要があるのに対し、矩形配列では1回のnew演算子の使用で領域が確保できる。ただし矩形配列は全要素が収まる連続領域を確保しなければならず、疎行列などのまばらな配列には空間的オーバーヘッドが大きくなってしまうことから向いていない。また、.NET Frameworkの中間言語には1次元配列の要素アクセスに関する専用命令が存在するため、矩形配列よりもジャグ配列のほうが速度性能面で有利になるケースも存在する[26]

C言語では、配列を指すポインタは、その配列のサイズを固定しなければならない。配列を指すポインタではなく、「『配列の先頭要素を指すポインタ』の配列」によって、次のようにしてジャグ配列のようなデータ構造を作ることができる。

int *numArr[3];
int tmp0[] = {1, 2, 3};
int tmp1[] = {4, 5, 6, 7};
int tmp2[] = {8, 9};
numArr[0] = tmp0;
numArr[1] = tmp1;
numArr[2] = tmp2;
printf("%d\n", numArr[1][1]); // print "5"

例示したように、「配列の配列」と同様の構文でアクセスできるが、データ構造としては異なっている[要追加記述]。当然、(生成されるコード[要追加記述]を読めばわかるが)意味的に違うものであって、混同してはならない。ましてや「多次元配列がサポートされていると考えるべき」などと考えるのは、混乱の元でしかない。

Iliffe vector

Iliffe Vectorのイメージ

「ジャグ配列と同様な構造で実装された、多次元配列」という意味の、Iliffe vector という語がある("Iliffe" は、人名 John K. Iliffe に由来)。それに対し、連続した領域を多次元配列として扱うデータ構造を指す dope vector(en:Dope vector)という語がある。

脚注

注釈

  1. ^ このオブジェクトとは、オブジェクト指向におけるオブジェクトではなく、実行環境においてメモリ上の何らかの値を表現するデータ領域を指す。
  2. ^ リンクリストではなく、メモリ上で連続している配列ベースのリストであるため、ランダムアクセスは定数時間のO(1)となる。

出典


配列(プログラム)

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2019/10/19 15:15 UTC 版)

次元」の記事における「配列(プログラム)」の解説

コンピュータ言語において添字指定できる一連の変数を配列(配列変数と言うが、ひとつの配列で独立して指定できる添字個数を配列の次元と言う。配列参照

※この「配列(プログラム)」の解説は、「次元」の解説の一部です。
「配列(プログラム)」を含む「次元」の記事については、「次元」の概要を参照ください。

ウィキペディア小見出し辞書の「配列」の項目はプログラムで機械的に意味や本文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。 お問い合わせ

配列

出典:『Wiktionary』 (2021/08/14 05:59 UTC 版)

別表記

名詞

はいれつ

  1. サ変順序決めて並べること。
  2. 情報技術プログラミングにおけるデータ構造一つ連続するアドレスデータ格納し、添え字によって順番アクセスすることを容易にするもの。

発音(?)

は↗いれつ

参照

語義2

動詞

活用

サ行変格活用
配列-する

「配列」の例文・使い方・用例・文例

Weblio日本語例文用例辞書はプログラムで機械的に例文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。



固有名詞の分類


品詞の分類


英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

「配列」に関係したコラム

辞書ショートカット

','','','','','','','','','','','','','','','','','',''];function getDictCodeItems(a){return dictCodeList[a]};

すべての辞書の索引

「配列」の関連用語



3
94% |||||

4
アレイ デジタル大辞泉
92% |||||

5
繰り返し配列 デジタル大辞泉
92% |||||






配列のお隣キーワード
検索ランキング
';function getSideRankTable(){return sideRankTable};

   

英語⇒日本語
日本語⇒英語
   



配列のページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
デジタル大辞泉デジタル大辞泉
(C)Shogakukan Inc.
株式会社 小学館
PHPプロ!PHPプロ!
©COPYRIGHT ASIAL CORPORATION ALL RIGHTS RESERVED.
IT用語辞典バイナリIT用語辞典バイナリ
Copyright © 2005-2024 Weblio 辞書 IT用語辞典バイナリさくいん。 この記事は、IT用語辞典バイナリの【配列】の記事を利用しております。
PHP Documentation GroupPHP Documentation Group
Copyright © 1997 - 2024 by the PHP Documentation Group.
JabionJabion
Copyright (C) 2024 NII,NIG,TUS. All Rights Reserved.
ウィキペディアウィキペディア
All text is available under the terms of the GNU Free Documentation License.
この記事は、ウィキペディアの配列 (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。 Weblio辞書に掲載されているウィキペディアの記事も、全てGNU Free Documentation Licenseの元に提供されております。
ウィキペディアウィキペディア
Text is available under GNU Free Documentation License (GFDL).
Weblio辞書に掲載されている「ウィキペディア小見出し辞書」の記事は、Wikipediaの次元 (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。
Text is available under Creative Commons Attribution-ShareAlike (CC-BY-SA) and/or GNU Free Documentation License (GFDL).
Weblioに掲載されている「Wiktionary日本語版(日本語カテゴリ)」の記事は、Wiktionaryの配列 (改訂履歴)の記事を複製、再配布したものにあたり、Creative Commons Attribution-ShareAlike (CC-BY-SA)もしくはGNU Free Documentation Licenseというライセンスの下で提供されています。
Tanaka Corpusのコンテンツは、特に明示されている場合を除いて、次のライセンスに従います:
 Creative Commons Attribution (CC-BY) 2.0 France.
この対訳データはCreative Commons Attribution 3.0 Unportedでライセンスされています。
浜島書店 Catch a Wave
Copyright © 1995-2024 Hamajima Shoten, Publishers. All rights reserved.
株式会社ベネッセコーポレーション株式会社ベネッセコーポレーション
Copyright © Benesse Holdings, Inc. All rights reserved.
研究社研究社
Copyright (c) 1995-2024 Kenkyusha Co., Ltd. All rights reserved.
日本語WordNet日本語WordNet
日本語ワードネット1.1版 (C) 情報通信研究機構, 2009-2010 License All rights reserved.
WordNet 3.0 Copyright 2006 by Princeton University. All rights reserved. License
日外アソシエーツ株式会社日外アソシエーツ株式会社
Copyright (C) 1994- Nichigai Associates, Inc., All rights reserved.
「斎藤和英大辞典」斎藤秀三郎著、日外アソシエーツ辞書編集部編
EDRDGEDRDG
This page uses the JMdict dictionary files. These files are the property of the Electronic Dictionary Research and Development Group, and are used in conformance with the Group's licence.

©2024 GRAS Group, Inc.RSS