多维数组的地址的有关问题

多维数组的地址的问题
假设有一个多维数组int a[2][3]={{1,2,3},{4,5,6}};int *p[3]=a;p=&a[1];为什么不是p=a[1]!p是一个指向数组的指针,a[1]就是表示第二维的首地址,为什么还要再在上面&运算。
  还有就是p是一个指向具有3个int元素的数组,为什么这里p实际上指向的是一个二维数组!!

------解决方案--------------------
楼主好像没搞明白什么是指针数组、什么是数组指针,你定义的是指针数组而不是数组指针,指针数组的定义为:int *p[3],p是一个数组名字,是个常量,这个数组有3个int型的指针,也就是int *a;这里p[1]与a是相同的,都是int型指针,他们指向int型变量,如果a++;就是说指向下一个int型变量,移动一个int型的长度;
而数组指针的定义为:int (*p)[3],这里p是指向一个有3个int型变量的数组,如果p++;p将移动3个int型变量的长度。
你的定义错误,应该这样定义:int a[2][3]={{1,2,3},{4,5,6}};int (*p)[3]=a;p=a[1];
int (*p)[3]=a;这一个语句其实严格说来并不准确,只是碰巧,严格来说,应该这样定义:
int (*p)[3]=*(a+0);也就是*a;说是碰巧就是a和*a中的地址值是相等的,a表示二维数组的首地址,
*(a+0)是表示这个二维数组的第一行数组的首地址,只是这两个首地址相等吧了
------解决方案--------------------
楼主好像没搞明白什么是指针数组、什么是数组指针,你定义的是指针数组而不是数组指针,指针数组的定义为:int *p[3],p是一个数组名字,是个常量,这个数组有3个int型的指针,也就是int *a;这里p[1]与a是相同的,都是int型指针,他们指向int型变量,如果a++;就是说指向下一个int型变量,移动一个int型的长度;
而数组指针的定义为:int (*p)[3],这里p是指向一个有3个int型变量的数组,如果p++;p将移动3个int型变量的长度。
你的定义错误,应该这样定义:int a[2][3]={{1,2,3},{4,5,6}};int (*p)[3]=a;p=&a[1];
*(a+0)表示的是一个有3个int型变量的数组,而int (*p)[3]表示的是一个指向有3个元素的数组的指针,比如:int b[3]={0};int (*c)[3];c=&b;是可以的,而c=b是错误的,
好比:int m = 9;int *n; n=&m;是正确的,而n=m;是错误的