从一维数组开始说起:
int a[3]={1,2,3};
int *p=a;
p指向数组的首地址,*p就是数组的第一个元素。
如果是二维数组:
int a[3][3]={1,2,3,4,5,6,7,8,9};
int *p=a;
这种写法是错的。二维数组是元素为一维数组的一维数组。显然,a表示的是一个有3个元素(每个元素是由3个元素构成的数组)的数组的首地址,所以要定义指向a的指针,必须进行如下定义:
int a[3][3]={1,2,3,4,5,6,7,8,9};
int (*p)[3]=a; //小括号不可省略
这样的话,要求二维数组a中的某个元素:比如:a[2][2]=9;
int a[3][3]={1,2,3,4,5,6,7,8,9},*p1,t;
int (*p)[3]=a;
p1=*(p+2);//p1指向数组a[3]的首地址
t=*(p1+2);//此时t的值等于a[2][2]
这样很容易理解,也很容易写出用指针访问二维数组的代码。
只要仔细琢磨,理解清楚了用指针访问二维数组的方法,用指针访问多维数组当然也不在话下。
下面有一段代码,用指针遍历数组,反复琢磨可以帮助理解。
#include <iostream>
using namespace std;
int main()
{
int a[3][3]={1,2,3,4,5,6,7,8,9};
for(int (*p)[3]=a;p!=a+3;p++)
for(int *t=*p;t!=*p+3;t++)
cout<<*t<<endl;
return 0;
}