摆脱typedef,它应该变得更加清晰:
void P (const int A [][10])
{
}
int main(void)
{
int A[10][10];
P(A);
return 0;
}
问题是函数参数中的数组“衰减”为类型为const int(*)[10]的指针,这是指向项为const的数组的指针.
此指针类型与从main传递的内容不兼容,因为该数组衰减为int(*)[10]类型的数组指针.
有一个规则“指向类型的指针可以转换为限定指针到类型”.例如int *的含义可以转换为const int *但不是相反.但是这条规则不适用于此.
因为“指向数组的指针”的限定版本是“const-pointer-to-array”,而不是“指向const-array”指针,这就是你在这里所拥有的.
不幸的是,这是C语言的一个弱点:使用数组指针时,不能有const正确性.唯一的解决方案是非常难看的:
P( (const int(*)[10]) A);
对于这样的情况,最好完全跳过const正确性,这有利于可读性.
编辑:在C11中你可以这样做,这更安全,但仍然依赖于执行转换的调用者:
#define const_array_cast(arr, n) _Generic(arr, int(*)[n] : (const int(*)[n])arr )
void P (const int A [][10])
{
}
int main(void)
{
int A[10][10];
P(const_array_cast(A,10));
return 0;
}