二维数组名的有关问题

二维数组名的问题
int i[4][4];

i +1 和*(i+1)的值为什么一样?

i是否实际上是&i[0];而不是&i[0][0]?

i是否为二级指针?

int (*p)[4] = i;

为什么就可以通过*(*(p+i)+j)来操控数组了?

------解决方案--------------------
http://topic.csdn.net/u/20091123/11/0c03d2e2-0655-4634-8287-0e2315d889fc.html?70028
------解决方案--------------------
i可以理解为数组的数组,即数组的指针,可以理解为[][4]类型. 第一个元素为[0][], 第二个元素为[1][].
i+1 极为第二个元素的指针, 即数组[1][]的指针;
*(i+1)指针的值,那就为数组[1][]。
由于指向的物理地址都一样,所以值是一样的。
------解决方案--------------------
其实只需要跟你解释以下 int i[4][4]; 这代码的具体含义你就知道了。
首先变量i是一个具有四个元素的数组,这四个元素又都指向一个具有四个元素的整型数组。
把这句话理解了, 就所有的都理解了。

 举个例子,就象你其中说的“ i是否实际上是&i[0];而不是&i[0][0]?”
&i[0] 的值和&i[0][0]的值是相等的,但意义不一样(对编译器来说),也就是输出的结果肯定是不同的,因为i[0] 保存的是一个指向一个具有四个元素的整型数组,而&i[0]则是获取这个数组的地址, 同样对于i[0][0]来说,i[0][0]是i[0]数组中的第一个数据,也就是一个整数,&i[0][0]则是这个整数的地址。
------解决方案--------------------
探讨

如果说i+1是一个很特别的指向自己的指针的话,那么*(*(i+1)+0)又没法解释了,
头痛, 不知道有人想过这个问题没

------解决方案--------------------
对于一个数组,我们能得到的信息有两个:1、数组大小 2、数组第0个元素的地址
对于二维数组i,i是二维数组的首地址,该二维数组有4个变量,每个变量的类型是包含4个变量的一维数组,因此i[0],i[1],i[2],i[3]是四个一维数组,根据数组所能提供的信息,从而可知,i[0],i[1],i[2],i[3]四个一维数组名分别是四个一维数组第0个元素的地址,即二维数组中每一行的首地址,而根据一维数组的知识,例如i[1]可以写成*(i+1),此时*(i+1)表示的是二维数组中每一行的首地址,即每一行一维数组的第一个元素的地址,要想获得每一行的第j个元素的地址,可用*(i+1)+j;要想取得此元素的引用,可用*(*(i+1)+j)即可。

记住第一句话,一个数组能给我们提供的只有上述两个信息,根据那两个信息去推导其它的。
------解决方案--------------------
楼主有自己的思考就好
至于结论,我就不说什么了