いつか、どこかで

【C言語とJava】配列の違い

今年の新人研修で、結構コーディングできるのに、私が配列の図解をしたら「初めてわかった!」ってなっている受講者がいて、やっぱり混同しやすいのかなーとまとめてみることにしました。

 配列の基本

まず要素5個の配列を作る場合 C言語では

int array[5];

Javaでは

int[] array = new int[5];

大括弧の位置が違いますが一緒でも良いです。メモリ上はこんなふうに違います。 f:id:riko111:20200313110924p:plain

※イメージ図です。実際のメモリ配置を表してはいません。

宣言と同時に初期化する場合、 C言語では

int array[] = {10,20,30,40,50};

Javaでは

int[] array = {10,20,30,40,50};

と同じように書けます。大括弧内の要素数は同時に初期化する場合のみ省略可能です。省略しなくても良いです。

この書き方を分けて書くと、 C言語では

int array[];
array = {10,20,30,40,50};

Javaでは

int[] array;
array = {10,20,30,40,50};

となりますが、どちらもコンパイルエラーになります。ただし、エラーになる箇所が違います。

がエラーです。これは、最初の図を見てもらえば、

  • C言語ではarrayのメモリは配列そのものなので宣言の時点で要素数が決定していないといけない
  • Javaではarrayのメモリは配列を参照するものなので宣言の時点で配列そのものの要素数が不明でもかまわない

という違いが理解できるかと思います。 そして、Javaでは

int[] array;
array = new int[]{10,20,30,40,50};

と記述することが可能です。

また、あらかじめ配列が用意されているときにその要素数を調べるには、 C言語では

int array[5];
int length = sizeof(array)/sizeof(int);

Javaでは

int array[5];
int length = array.length;

となります。

二次元配列

次に、二次元配列について見てみます。 C言語では

int array[2][3];

Javaでは

int[][] array = new int[2][3];

メモリ上はこうなります。 f:id:riko111:20200313115934p:plain

宣言と同時に初期化する場合

int array[][3] ={{10,20,30},{40,50,60}};

Javaでは

int[][] array = {{10,20,30},{40,50,60}};

となって、C言語で要素数を省略できるのは1次元目のみ、Javaではどちらも省略可となります。もちろん、省略しなくても良いです。

メモリ上はこうなります。 f:id:riko111:20200313115930p:plain

また、Javaでは

int[][] array;
array = new int[2][];
array[0] = new int[]{10,20,30};
array[1] = new int[] {40,50,60};

という風に書くことが可能で、

int[][] array;
array = new int[2][];
array[0] = new int[3];
array[1] = new int[2];

というように2次元目を違う要素数にすることが可能です。C言語では2次元目の要素数は全部同じでないといけません。

C言語でもJavaでも、次元を増やしていくことが可能ですが、

という違いがあります。

また、要素数を調べる場合、 C言語では

int array[2][3];
int length = sizeof(array)/sizeof(int);

Javaでは

int array[2][3];
int length = array.length;

となりますが、このとき、lengthに格納される値は

になります。これも、図を見てそれぞれの言語のarrayが表すメモリを見ていただければと思います。

こんなふうにC言語Javaでは配列が違うので、注意しましょう。