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