为什么这是合法的C而非非法的C ++?
int m[4][5];
int *p = m;
我认为C通过将m衰减到int (*)[5]
然后再迁移到int *
来实现远远的目标,而C ++似乎只进行了第一次衰变。
答案 0 :(得分:4)
它不合法C.刚从现在的铿锵声测试:
example.c:2:6: warning: incompatible pointer types initializing 'int *' with an
expression of type 'int [4][5]' [-Wincompatible-pointer-types]
指针类型之间的所有转换(void *
除外)都需要在C中进行显式转换。如果你的编译器让你得到更多,那就是语言标准。
根据规范 6.5.4投射算子,第3段:
涉及指针的转换,除了6.5.16.1的约束允许的范围外,应通过显式转换来指定。
6.5.16.1是void *
的例外。