复习:C++中二维指针访问数组

 

关于用指针方式访问二维数组的问题

首先,以二维数组a[2][3]为例,a是由数组a[0]、a[1]组成的一维数组,因此,数组名a可以看作是a[0]、a[1]的首地址,即a==&a[0]。
然后,对于二维数组,在这里引入两个概念:
1、一级指针:带一个下标的数组名是一级指针,偏移量是一个元素的长度,它所指对象是数组元素。
2、二级指针:不带下标的数组名是一个逻辑上的二级指针,所指对象是行向量,偏移量是一行元素的存储长度。
定义一个二维数组和二级指针变量
int a[2][3],**p;
不可以用p=a;
因为p的定义可以解读为:int *(*p);
即指针p的关联类型为int*  而数组a的定义可以解读为:
int(a[2])[3];
a是关联类型为int[3]的一维数组。
很显然,a与p的关联类型都不一样,故而不能用p去操作a。
在这举一个例子来说明:

如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维数组的个数。但扩展性强。 

同样三维数组可以使用指向指针的指针的数组。通常很少用。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值