kazuki2655 さんが書きました:clコンパイラだと問題なく通るのですが、gccですと警告されます。
gcc --version でバージョンの確認をお願いします。
gcc 4.8.4 では、その警告が出ましたが、
gcc 5.3.0 では、その警告が出ませんでした。
print_array(const int n[10][10]) という宣言は、
print_array(const int (*n)[10]) という宣言と同じです。
main で宣言されている n の型は int[10][10] です。
print_array を呼び出すときの引数 n は、int (*)[10] に型変換されます。
int (*)[10] と const int (*)[10] の型が異なるので、gcc 4.8.4 では、
incompatible pointer type だという警告を出したのでしょう。
一次元配列の場合を考えてみましょう。
コード:
void print_array(const int n[10])
{
/* n[]の中身を表示 */
}
int main(void)
{
int n[10];
print_array(n);
return 0;
}
この場合、呼び出し側の n の型は int *。
関数の宣言の引数 n の型は const int *。
型は異なりますが、型 T へのポインタは、型 const T へのポインタに変換できるので、問題ありません。
二次元配列の場合の int (*)[10] は、型 T が int [10] であり、その型へのポインタです。
int [10] に const をつける記法がありません。
const (int [10]) や int [10]const はダメです。
const int [10] や int const [10] とすると、それは、int を const で修飾したのであって、
配列 [10] を const で修飾したことになりません。
gcc 5.3.0 で、なぜ警告を出さなくなったのかは知りませんが、
警告なしでも問題にならないからでしょうか。