为什么这个声明不起作用

Exp*_*ice 5 c pointers

In int (*x)[10]; x是一个指向10 int秒数组的指针

那么为什么这段代码不能编译:

int arr[3] ;

int (*p)[3] =arr;
Run Code Online (Sandbox Code Playgroud)

但这有效:

int  arr[3];

int (*p)[3] =&arr;
Run Code Online (Sandbox Code Playgroud)

Mic*_*urr 10

arr是一个计算结果的表达式int*(这是着名的'数组衰减到指针'功能).

&arr是一个计算结果为a的表达式int (*)[3].

数组名称'衰减'指向所有表达式中数组的第一个元素,除非它们是sizeof&运算符的操作数.对于这两个操作,数组名称保留其"数组"(C99 6.3.2.1/3"左值,数组和函数指示符").