如p+i的地址偏移量为p+sizeof(int*) *i 而a+i的地址偏移量为a+sizeof(int[4])*i 显然二级指针变量与二维数组名是不同的,我们必须定义一个指向一维数组的指针来操作逻辑上位二级指针的二维数组名。 下面举一个实例:
#include<iostream> #include<iomanip> using namespace std; int main() {int a[2][3]={6,8,3,2,3,9}; int i,j,total=0; int *p,(*m)[3]; //m为指向一维数组的指针 for(p=a[0];p<a[0]+6;p++) total+=*p; cout<<"total="<<total<<endl; for(i=0;i<2;i++) {m=a+i; for(j=0;j<3;j++) cout<<setw(5)<<*(*m+j);//以指向数组的指针访问二维数组 cout<<endl; system("pause"); } }运行结果如下:在这个程序中,m是一个指向长度为3的一维数组指针,执行m=a+i;时,其指向二维数组第i行。 而*m+j 为第i行第j列元素的地址,即&a[i][j], 故* (*p+j) 是访问元素a[i][j]
注意:在二维数组中a=&a[0] , a+1=&a[1] ,
而a[0]=&a[0][0] ,a[0]+1=&a[0][1]
一维指针通常用指针表示,其指向的地址是数组第一元素所在的内存地址,如下
int ary[4][5]; int(*aryp)[5] = ary;那么ary[4]相当于int(*aryp),以下理解如此,但参数传递需要知道实参所在 的一维个数,所以传递的时候应该传递多一个参数,子数组的引用可以理解 为(*p),那么取元素就是(*p)[i],如下void printVal(int(*aryp)[5],int irowCount){
for (int(*p)[5] = aryp; p != aryp + irowCount;p++) { for (size_t i = 0; i < 5; i++) { cout << (*p)[i] << endl; } } }缺点就是:传递的时候还需要传递1维数组的个数。但扩展性强。
同样三维数组可以使用指向指针的指针的数组。通常很少用。
