指针与多维数组(2)

因为指针与数组的结合产生了很多有趣的东西,所以接着来看看多维数组与指针之间的关系,看看指针数组和数组指针!!

指针数组: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];

.

.

.

一直往下拨开就可以了,,记住 *+地址就是间接引用某个空间,对其进行读,取,写操作;



你可能感兴趣的:(多维数组,C语言,指针)