ジャグ配列

 
今回は配列。
たまたま@IT会議室でジャグ配列に関する初歩的な質問が取りざたされていたので、回答してみた。
 

@IT会議室 > Insider.NET 会議室 > 多次元配列のbyte配列をString型にしたい:
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=41935&forum=7&9

 
一応こちらで釈明しておこう。
お勉強のためにちょうどジャグ配列の辺りを記事にしようと思っていたところ、ホントの初歩で躓いている方がいたので回答した。
本来ならば、既に適切な回答をされていた方々が提供してくれている情報に従えば、解決できたはずの問題。
 
が、きっと投稿者の「調べる」は的を射ていないのだろう。
「多次元配列」と「配列の配列」の違いに気づいておられない可能性もある。
※上記スレッドのレスには「配列の配列」は「多段階配列」とも表現されているが、本記事では前者で統一
同じ初心者の私の回答が彼を助けることになるのであれば、という気持ちで答えてみた。
(彼自身が既に必要十分の情報から解決できないことは今後の問題になるはずだけど…
 
 
 
とにかく、今日はちょうど配列をお勉強しようと思っていたところ。
今回は@ITの記事と書籍「独習C#」でお勉強。
 

改訂版 C#入門
第15章 C#の配列機能:
http://www.atmarkit.co.jp/fdotnet/csharp_abc2/csabc2_015/cs2_015_01.html

 

独習C#
5.1 配列:
http://www.amazon.co.jp/%E7%8B%AC%E7%BF%92C-%E3%83%8F%E3%83%BC%E3%83%90%E3%83%BC%E3%83%88-%E3%82%B7%E3%83%AB%E3%83%88/dp/479810146X

 
まずは一次元配列。
 

int[] arr = new int[2];
arr[0] = 100;
arr[1] = 200;

 
C言語とかから考えると、定義段階で new する辺りが今までと違うかもしれない。
構文も違うけど。
とはいえ、慣れれば特に問題はない程度。
 
問題なのは次から。
冒頭の@IT会議室の件でも書いたようにC#では「多次元配列」と「配列の配列」が別表現でプログラム出来る。
 
二次元マトリクスの配列を扱う方法を以下に二つ紹介する。
 

//多次元配列
int[] arr = new int[2,2];
arr[0,0] = 100;
arr[0,1] = 101;
arr[1,0] = 200;
arr[1,1] = 201;

 

//配列の配列
int[] arr = new int[2][];
arr[0] = new int[2];
arr[1] = new int[3];
arr[0][0] = 100;
arr[0][1] = 101;
arr[1][0] = 200;
arr[1][1] = 201;
arr[1][2] = 202;

 
おわかりいただけるだろうか。
多次元配列は一度に二次元配列のメモリを確保している。
対して、配列の配列はまず int 配列2行分(一次元)のメモリを確保し、その後二次元の各要素分のメモリを確保している。
後者(配列の配列)は、行の要素数が異なっていても良いのだ。
 
□を一つの int 用メモリ領域として表すと、以下のようになる。
(上記例の場合)
 
多次元配列:
 
 □□
 □□
 
配列の配列:
 
 □□
 □□□
 
配列の配列、とこれまで記述してきた配列の形式。
これが別名「ジャグ配列」である。
※「ジャグ」=「ぎざぎざした」
 
その名の通り、多次元の配列の各次元要素数が一致しなくても良いことを意味する。
どうやら、最近の一般的流行り廃り的には「配列の配列」の使用率の方が高いらしい。