问题描述
如果数组名称指向第一个元素,那么n应该给出位置2, 为什么会有这个警告?
#include <stdio.h>
int main()
{
int n[3][3] = {
{2,4,3},{6,8,5},{3,5,1}
};
int i,*pt;
pt = n ;
for (int i = 0; i <=8; i++)
{
printf("%d\n",*(pt + i) );
}
}
但是当我写pt = *n
时;它工作正常。为什么?
解决方法
在某些情况下,数组类型将“衰减”为指针类型,其中
外部数组维度[]
被替换为*
。例如,int a[5]
将衰减到int *
,而int b[5][10]
将衰减到int (*)[10]
。
在您的情况下,int n[3][3]
会衰减到int (*)[3]
,因此您可以将n
分配给该类型的指针而无需强制转换。但是它与int *
(例如int *pt
)不兼容,因此尝试将n
分配给pt
会导致错误。如果您希望int (*pt)[3];
是兼容的指针类型,则可以声明pt
。
如果要将n
视为固定存储并使用int *pt;
进行访问,则可以像int *
一样将其转换为pt = (int *) n;
。在这种情况下,您可以将n
视为9
整数的平面数组。然后,您可以使用pt[i]
来引用元素,这是编写等效的*(pt + i)
的正常方法。
通常,尽可能尝试使用兼容的指针类型,而无需强制转换。但是,如果您真的想将数组视为具有不同的形状,那么在数据分配兼容的情况下,可以在进行指针分配时使用强制转换。