1 関数引数とポインタ

   1.6 多次元配列とポインタ配列データの受け渡し
 次に2次元配列のデータを引数として渡すにはどのようにすれば良いでしょうか。
void function(int array[ ][5]); /* プロトタイプ宣言 */

int main(void){
        int array[2][5]; /* 2次元配列の宣言 */
        ...
        function(array); /* 関数呼び出し */
}

void function(int array[ ][5]){ /* 関数定義部 */
...
}
 1次元配列の場合は、プロトタイプ宣言部と関数定義部で配列の要素数指定は必要ありませんでした。しかし、2次元配列の場合は、一番右側の要素数を指定しておかないといけません。
その理由は、4-4節で説明したように、2次元配列がメモリ上では連続した領域に格納されていることに起因しています。つまり、一続きのメモリ上のデータで、列の区切りがどこかを指定してやらないと配列の先頭アドレスだけでは、配列を正確に復元できないのです。

 同様の理由で、3次元以上の多次元配列でも要素数の省略ができるのは、配列の一番左側の要素だけです。

 ポインタ配列の引数受け渡しはどうなるでしょうか。
void function(int *parray[ ]); /* プロトタイプ宣言 */

int main(void){
        int *parray[5]; /* ポインタ配列の宣言 */
        ...
        function(parray); /* 関数呼び出し */
}

void function(int *parray[ ]){ /* 関数定義部 */
...
}
 このように、ポインタ配列の先頭アドレスを実引数として受け渡すことで実現できます。