指针访问二维数组的困惑。解决方法

指针访问二维数组的困惑。


#include <iostream>
#include <string>
using   namespace   std;
void   main()
{
int   a[4][4]   =   {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
int   i;

//   输出每一行的地址
for(i=0;i <4;i++)
{
  cout   < <   "第 "   < <   i+1   < <   "行的起始地址: "   < <   endl;  
cout   < <   a[i]   < <   endl;
cout   < <   &a[i]   < <   endl;
cout   < <   a+i   < <   endl;
cout   < <   *(a+i)   < <   endl;
cout   < <   &a[i][0]   < <   endl;
cout   < <   endl;
}
}

看了一本教程,有个例子是使用指针输出一个二维数组每一行的地址。程序代码如上,我始终想不明白的是为什么   &a[i]   和   a[i]   都表示每一行的地址?同样为什么   a+i   和   *(a+i)   都表示每一行的地址?

我能理解的是a[i]   、a+i   和   &a[i][0]表示每一行的地址。



------解决方案--------------------
它们的值相同,可是类型不同。
可以试试cout < < typeid(&a[i]).name() < < (int)(&a[i]) < < endl;
每个都打出来试试