int main()
{
  char a[3][3]={'1','2','3','4','5','6','7','8','9'};
  char (*p)[3];
  p=a;
  PF("%c %c\n",**p,**p+1);
  PF("%c %c\n",**a,**a+1);
  PF("%p %p %p %p\n",*p,*p+1,p,p+1);
  PF("%p %p %p %p\n",*a,*a+1,a,a+1);
  return 0;
}

如上所示,假设a 是二维数组,p是一个数组指针;

1.对p来说,指向的是二维数组的首元素(一个一维数组),对其++,可以使其指向二维数组里的下一个元素(一维数组),对其解引用(*p)就可以使其指向这个一维数组的首元素(一个字符),再++,可以使其指向这个一维数组的另一个元素(一个字符),然后再解引用(**p),可以得到当前指向的元素的值(一个具体的char值)。

2.对a来说,因为数组名也就是数组的首元素(一个一维数组)的地址,可以使其指向二维数组里的下一个元素(一维数组),对其解引用(*p)就可以使其指向这个一维数组的首元素(一个字符),跟p是一样的。

最后的输出结果为:

二维数组指针_二维数组