int (*p)[4] , *ptr;
int a[4] = {10,20,30,40};
printf("%p\n%p\n%p",&a,a,&a[0]);
p = &a ;
//p=a; gives error
//ptr = &a; gives error
ptr = a;
输出:
0x7ffd69f14710
0x7ffd69f14710
0x7ffd69f14710
我试图了解a
,&a
和&a[0]
返回什么以及它的起始变量的内存地址。那么,为什么在某些作业中我会出错?
我的意思是,如果p = &a = 0x7ff...
有效,为什么p = a = 0x7ff..
不起作用?
[如果可能,任何人都可以通过框图来了解该p和ptr实际指向的地方。或者他们只是指向相同。但是我肯定知道它们是不同的东西。
我试图了解
a
,&a
和&a[0]
是什么。
在C数组中衰减到指针。所有这些指针都引用数组的相同第一个元素。唯一的区别是类型。
[&a
和&a[0]
具有数组元素的类型(在这种情况下为int
)] >>
[&a
是元素类型的数组类型(在这种情况下为4个整数的数组)。
p
是指向类型为int[4]
的值的指针,即,指向每个4个整数的数组的指针。请注意,sizeof(*p)
是sizeof(int)
的4倍。
想象一下,指针是激光指针,具有不同的颜色(红色表示int,绿色表示指向数组的指针,...),并且变量是您可以指向使用正确的激光指针
在C中,数组类型的表达式能够衰减到指向数组第一个元素的指针。