因为指针与数组的结合产生了很多有趣的东西,所以接着来看看多维数组与指针之间的关系,看看指针数组和数组指针!!
指针数组:int * as[10];
数组指针:int (*as)[10];
[]的作用:
1.定义变量时有[],代表定义的是数组;
2.参数传递时有[],代表传递的是指针;
3.地址的右边时[],代表的是下标访问;
#include <stdio.h> int main() { int as[2][3]={{1,2,3},{4,5,6}}; int (*p)[2][3]=&as; /* p==&as; *p==as==&as[0]; int (*)[3] **p==as[0]==&a[0][0]; int * ***p==as[0][0] */ printf("%d\n",as[0][0]);//1 printf("%d\n",**as);//1 printf("%d\n",***p);//1 printf("%d\n",as[1][2]); //6 printf("%d\n",*(*(as+1)+2)); //6 printf("%d\n",*(*(*p+1)+2));//6 printf("%d\n",*(**(p+1)-1));//6 return 0; }
定义数组指针非常简单:看数组什么类型的,把数组名换成指针就可以了!!!
例如:
int as[1][2][3][4][5][6][7][8][9][10];
看到这么大个数组是不是有点儿害怕,不用怕;
下面来定义该类型的数组指针;
int (*pp)[1][2][3][4][5][6][7][8][9][10]=&as;
对,就这么简单,不用怀疑!!为什么是10维,因为编译的时候好像最多就支持10维,在VS6上运行通过,11就不行了,其实在我看来,并没有多维,都是一维,一维里包含了一维,一维里包含了一维,嵌套而已,因为内存里的存储都是连续线性的!!!个人理解!!
下面来看一个有趣的问题:
as[3][3];如果要输出as[1][2],将其转化为指针如下:
(*(as+1))[2]----->*(*(as+1)+2)
as[m][n][p][q][r][s];
怎么样用指针来转化他们呢,一层一层拨开他们的皮,最后全部变成指针呢:
(*(as+m))[n][p][q][r][s];
(*(*(as+m)+n))[p][q][r][s];
(*((*(*(as+m)+n))+p))[p][q][r][s];
.
.
.
一直往下拨开就可以了,,记住 *+地址就是间接引用某个空间,对其进行读,取,写操作;