
如果有int a[5][6],(*p)[3];p=a;存不存在p[4]呢?p[2],*(p+2),p[1]+1都表示什么呢?
楼主你好。
测试代码:
#include <stdio.h>
void main(){
int a[5][6]={1,2,3,4,5,6,7,8,9,10,11,12},(*p)[3];
p=a;
printf("a=%d, *a=%d, **a=%d, p=%d, *p=%d, p[0]=%d\n",a,*a,**a,p,*p,p[0]);
printf("a[0]数组的长度为%d, *p数组的长度为:%d\n",sizeof(a[0])/sizeof(int),sizeof(*p)/sizeof(int));
printf("p[1]=%d, *(p+1)=%d, p+1=%d\n",p[1],*(p+1),p+1);
printf("p[4]=%d, p[2]=%d, *(p+2)=%d, p[1]+1=%d,&a[1][1]=%d\n",p[4],p[2],*(p+2),p[1]+1,&a[1][1]);
printf("p[2]=%d, &a[2][0]=%d\n",p[2],&a[2][0]);
printf("(*p)[10]=%d, *p[1]=%d\n",(*p)[10],*p[1]);
}
运行结果:
首先你要理解:
int (*p)[3]是指p是一个指针,它指向一个含有三个int元素的一维数组。
而int *p[3]是指p是一个数组,其中有三个指向int元素的指针。
还有你要理解p[n]就是*(p+n)。
对于int (*p)[3],p是一个指向数组的指针,因此p相当于二维数组的首地址。
*p或p[0]就是p指向的那个数组的地址,它的类型为int[3],其实是a[0]的地址【注意a[0]其实是有6个元素,但是编译器只是认为*p有三个元素】。
p[2]就要在p[0]的基础上加上sizeof(int)*3*2=4*3*2=24(也就是两个int[3]数组的长度),如图中为1244904,【含义就是p[2]在p[0]的基础上向后偏移2个int[3]数组的长度】,p[4]在p[2]的基础上加24,如图中为1244928。
*(p+2)等效于p[2]。
p[1]的值为1244904-sizeof(int)*3=1244892,p[1]的类型为int*,因此p[1]+1=p[1]+sizeof(int*)=1244892+4=1244896.
事实上洛雨曦1125说的都是错的。。。并不是黑他,而是怕误人子弟。
也更正一下White_MouseYBZ的说法,p=a这句话可以通过编译,因为编译器是只认为p指向了一个有三个元素一维数组,也就是说p是一个指针,因此只要对p赋指针值即可,并没有那么多限制。
p[2]就等价于是a[2]即第二行的首地址也就是说是a[2][0]的地址
*(p+2) p+2是p[[2]的地址,因此*(p+2)就等价于p[2]
p[1]+1指的是第1行第1列元素的地址即a[1][1]的地址
若不明白再问