C 为什么int(*ptr)[10]类型的指针需要数组的地址,而不仅仅是数组本身

C 为什么int(*ptr)[10]类型的指针需要数组的地址,而不仅仅是数组本身,c,arrays,pointers,C,Arrays,Pointers,数组返回指向第一个元素的指针。我有如下简单代码: int a[10] = {1,2,3};//Filled three elements int (*ptr)[10];//pointer to an array of 10 ints ptr = a; 我正处于警告之下 warning: assignment from incompatible pointer type 如果我修改如下所示的指针定义,则没有警告 ptr = &a; 为什么第一个赋值会导致警告?&a是否返回指向10个元

数组返回指向第一个元素的指针。我有如下简单代码:

int a[10] = {1,2,3};//Filled three elements
int (*ptr)[10];//pointer to an array of 10 ints
ptr = a;
我正处于警告之下

warning: assignment from incompatible pointer type
如果我修改如下所示的指针定义,则没有警告

ptr = &a;
为什么第一个赋值会导致警告?&a是否返回指向10个元素数组的整数指针?请帮助理解。谢谢

除非它是sizeof运算符或一元&运算符的操作数,或者是用于初始化数组的字符串文字,否则类型为“类型的数组”的表达式将转换为类型为“指向类型的指针”的表达式,该表达式指向数组对象的初始元素,而不是左值

除了
sizeof
alignof
运算符之外,数组会衰减为指针

int a[10] = {1,2,3};//Filled three elements
int (*ptr)[10];//pointer to an array of 10 ints
ptr = a;
在赋值
ptr=a
中,
a
衰减为指向int(
int*
)的指针,该指针指向第一个元素

int a[10] = {1,2,3};//Filled three elements
int (*ptr)[10];//pointer to an array of 10 ints
ptr = &a;
此处
&a
的类型为
int(*)[10]
,它是指向10个int数组的指针,与
ptr
的类型相同。这是向数组分配指针的正确方法


还请注意,
a
&a
的值本身是相同的,唯一的区别是类型。

在大多数情况下(除了
sizeof
&
)数组衰减为指针
ptr=a
此处
a
衰减为type
int*
。但它是指向第一个元素的指针,而不是指向数组的指针
ptr=&a
此处
&a
的类型为
int(*)[10]
,是指向数组的指针。还要注意的是,第一个元素和数组的物理地址是相同的,唯一的区别是类型。错误消息有什么不清楚的?(许多编译器还声明了invlove的类型,这应该更清楚)您忘记了
alignof
Sidenote:不能保证不同类型的两个指针的值是相同的。例如,对于类型识别指令集,可以在值中对类型进行编码。