因为指针与数组的结合产生了很多有趣的东西,所以接着来看看多维数组与指针之间的关系,看看指针数组和数组指针!!
指针数组: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就不行了,其实在我看来,并没有多维,都是一维,一维里包含了一维,一维里包含了一维,嵌套而已,因为内存里的存储都是连续线性的!!!个人理解!!
为了能更加直观的描述它们之间的区别,补上一段代码和一张图,一目了然:
代码:
#include <iostream>
using namespace std;
int main()
{
int array[2][2][2]={1,2,3,4,5,6,7,8};
int (*p)[2][2][2]=&array;
int (*p1)[2][2]=array;
cout<<sizeof(array)<<endl;
cout<<sizeof(&array)<<endl;
cout<<array<<endl;
cout<<&array<<endl;
cout<<array+1<<endl;
cout<<&array+1<<endl;
cout<<array[0][0][0]<<" "<<&array[0][0][0]<<endl;
cout<<array[0][0][1]<<" "<<&array[0][0][1]<<endl;
cout<<array[0][1][0]<<" "<<&array[0][1][0]<<endl;
cout<<array[0][1][1]<<" "<<&array[0][1][1]<<endl;
cout<<array[1][0][0]<<" "<<&array[1][0][0]<<endl;
cout<<array[1][0][1]<<" "<<&array[1][0][1]<<endl;
cout<<array[1][1][0]<<" "<<&array[1][1][0]<<endl;
cout<<array[1][1][1]<<" "<<&array[1][1][1]<<endl;
system("pause");
return 0;
}
运行结果:
详细分析如下图
下面来看一个有趣的问题:
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];
.
.
.
一直往下拨开就可以了,,记住 *+地址就是间接引用某个空间,对其进行读,取,写操作;