転職して業務系の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]) {
}