c语言不兼容的指针,GCC发出不兼容指针类型的警告

摆脱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;

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值