C vs C ++中的数组衰减规则?

时间:2016-03-18 16:45:44

标签: c++ c pointers multidimensional-array

为什么这是合法的C而非非法的C ++?

int m[4][5];
int *p = m;

我认为C通过将m衰减到int (*)[5]然后再迁移到int *来实现远远的目标,而C ++似乎只进行了第一次衰变。

1 个答案:

答案 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 *的例外。