ポインタ
配列
C言語

[C言語]2次元配列とポインタの配列の違い

転職して業務系のSE(Java)から組み込み系PGの見習いになったので、C言語の研修で聞いた内容で、今まで自分が知らなかった部分のメモとして書きます。
勉強中ですので、経験者の方のツッコミをお待ちしております。

2次元配列とポインタの配列の違い

2次元配列は1次元配列と同じように連続したメモリの領域を確保する。
ポインタの配列の場合、2次元目の配列(1次元目の配列が指す先)はメモリ上のどこかにあり、他の2次元目の配列とは連続している必要は無い。

また、2次元配列の場合、アドレスを保持しているのはarray[0][0]のアドレスだけであり、array[1][0]にアクセスするときは
&array[0][0]+1*(2次元目の配列の要素数)+0という式を使う。
そのため、2次元配列を関数の引数として渡すときには、関数側で2次元目の要素数を指定しておく必要がある。

2次元配列を関数に渡す
// 2次元配列を渡すときは2次元目の要素数を確定させる必要がある。
void func1(int array[][5]) {
    array[1][0] = 1;    // *(array + (1*5) + 0) = 1;と同義
}

// 2次元目の要素数を引数に取れば、以下のような書き方もできる。
void func2(int num, array[][num]) {
}