指针和数组有很多种配合的方式,当然每一种方式的访问方法是不一样的。
—————————————————————————————————————————————————————————
1、
int a[4]={1,2,3,4};
int (*p)[4]=a;//这里的指针是指向的数组的首地址;
---->访问方式:(*p)[1] 与a[1]等效
—————————————————————————————————————————————————————————
2、
int a[4]={1,2,3,4};
int *p = a;
---->访问方式:*(p+1) 与a[1]等效
—————————————————————————————————————————————————————————
3、
int a[4]={1,2,3,4};
int *p = &a;
---->访问方式:*((*p)+1) 与a[1]
访问第一个元素时:*((*p)+1)= **p = a[0]
—————————————————————————————————————————————————————————
4、
int a[3][3]={
{1,2,3},
{4,5,6}
};
int (*p)[3]=a;//这里的指针指向的是二维数组的首地址(一次访问三个)
---->访问方式: p[1][1]=a[1][1]=*(*(p+1)[1])=*(p[1]+1)=5
—————————————————————————————————————————————————————————
5、
int a[3][3]={
{1,2,3},
{4,5,6}
};
int (*p)[3][3]=a//或等于&a都一样
---->访问方式:(*p)[1][1]=a[1][1]=5
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————
那么以上的访问方式有什么规律呢?
规律:
首先要有类型的概念。也就是指针到底指向的是什么拿第三种情况来讲吧:
p是一个指针,根据右左法则:从p开始向右看遇到括号返回往左会遇到*,说明这是一个指针;然后括号便可以去掉继续向右看遇到[4]。这里解释了数组类型的内存空间大小为4个字节的数组,再向左看遇到int解释了数据,即是说存放的数据为int型的。这样这个指针就明显了,是一个指向整型内存大小为四个字节的数组,由于使用&a初始化数组。前一篇日记以及说过了,&a表示的是整个数组,也就是说这个指针指向的是整个数组。(*p)+1只是一个地址的增加,所以要加*进行地址转换。这就是*((*p)+1)=a[1]的由来。其他的组合方式均可以用这种方法进行分析,这里就不在累述了。