当前位置: > 华清远见教育科技集团 > 嵌入式学习 > 讲师博文 > 怎样理解二维数组
怎样理解二维数组
时间:2016-12-14作者:华清远见

首先,我们先从简单的一维数组看起;

大家都知道,int a[5]是一个一维数组,a是这个一维数组的名字,它的每一个元素都是一个int类型的变量;

因此,它的指针移动单位是一个元素,针对int类型就是四个字节;

我们可以这样定义一个指向一维数组的指针:int *p;

这时,对指针p做算数运算时,偏移量也是一个整形;

如下:

我们再回过头来看一下二维数组名的含义;

例如,有如下定义:

int a[3][4]={{10,20,30,40,},
                {50,60,70,80},
                {90,91,92,93}
        };

则数组a有3个元素,分别为a[0]、a[1]、a[2]。而每个元素都是一个一维数组,各包含4个元素,如a[1]的4个元素是a[1][0]、a[1][1]、a[1]2]、a[1][3]。

这个时候,大家要注意:a[0]、a[1]、a[2]表示的是每个一维数组的数组名;

既然它是一个一维数组的数组名,那么我们就可以这样去定义一个指针:

int *p = a[0];

//看起来很别扭是吧,请联想指向一维数组的指针定义,a[0]不就是一维数组的数组名嘛,OK了吧;

a[0], a的区别

既然我们说到这了,那我们来讨论一下:a[0], a的区别;

a是一个二维数组名,a[0]是一维数组名,既然都是数组名,那么它们肯定都是地址常量,既然a[0]是这个二维数组第一个元素(一维数组)的数组名,那么它们两个的值肯定是一样的,对吧,ok!这个问题不大,我们直接写个代码验证一下就好;

 

虽然它们两个的值是一样的,但问题是它们是一样的东西吗?

我们分别对a和a[0]取 ’*’ ,看下结果;

这个时候,我们发现*a和*(a[0])得到的都是它们第一个元素,但是,你要想清楚,二维数组的元素是一个一维数组,这里得到的是它的首地址,而*(a[0])得到的是一维数组的元素,就是一个int类型变量的值了;

那你觉得int *p = a;对吗?

肯定是错的,只能用a[0]对p赋值;

怎样用一级指针遍历一个二维数组?

现在大家想个问题?怎样用p去引用a[2][3]这个元素呢?

一起来分析,指针变量p指向的是什么类型的变量?int类型对不对;

那么,它跳一次的偏移量是几个字节?不就是4个字节嘛;

那么我们现在要解决的问题就是p要跳多少个这样的4字节?

a[3][4]一共有3行4列,那么a[2][3]在第几行第几列?2行3列是吧(记住:下标从0开始);相信你已经知道了,是不是:p + 2 * 4 + 3;

那如果让你总结出一个公式呢?比如我要引用的是a[m][n];

a[m][n] = *(p + m * 4 + n);

现在,我们就能很容易的用一级指针遍历一个二维数组了,代码如下:

发表评论
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)