関数にパラメーターとして渡されるときに C 配列の要素数 (次の例では 10) を指定する必要があるのはなぜですか?
void myFun(int arr[][10]) {}
アクセスされるセルのアドレスを決定するために要素の数が必要だからでしょうか。
関数にパラメーターとして渡されるときに C 配列の要素数 (次の例では 10) を指定する必要があるのはなぜですか?
void myFun(int arr[][10]) {}
アクセスされるセルのアドレスを決定するために要素の数が必要だからでしょうか。
はい。これarr[i][j]
は、 ((int *)arr)[i * N + j]
if arr
is an int [][N]
: ポインター演算には行の長さが必要であることを意味するためです。
コンパイラは、次の行がメモリ内でいつ開始されるかを把握する必要があります (2D 配列はメモリの連続したチャンクであり、行が次々と続くため)。コンパイラはサイケではありません!
配列の考えに静的割り当てを使用した場合にのみ必要です。生成コードは、ruakh が指摘したように、配列用の連続したメモリ ブロックを作成するためです。
ただし、動的割り当てを使用する場合は必要ありません。ポインターを渡すだけで済みます。
よろしく