二维数组和多维数组的本质及寻址方式
二维数组和多维数组的本质还是一维数组,一维数组是一个特殊的一维数组。数组的数组就是多维数组,这个数组的元素不是基本数据类型,而是数组。
int ary[5],float ary[5],double ary[5],这种数组称为基本类型数组。整形可以当元素,通过类比,数组也可以当元素。
把一维数组作为元素的数组,称为二维数组。把二维数组作为元素的数组,称为三维数组。元素是几维元素,就是几维加一的数组,元素是 n 维数组,那就是 n+1 维数组。
数组的数组,在生活中经常会遇到。例如学校考试之后,会记录学生的分数。放全班同学的分数用一维数组就可以。
如果,学校同一年级,有 5 个班,这时,用一维数组是不够的,要用到二维数组,相当于 5 个一维数组构成了二维数组。
再举一个例子。小学用的作文本,一个作文单元格,视为一个元素,每一行构成了单元格的数组,一行有 20 个单元格,构成的数组是 ary[20]。
一页有 15 行,基本元素为行,定义为一页,换算成单元格,构成的数组是 ary[20][10] ,二维数组。
一本有 50 页,基本元素为页,定义为一个本,换算成单元格,ary[50][20][10] ,三维数组。
以此类推……
最后举一个例子。更像多维数组结构的,是小学笔盒中的钢尺,它的 1 小格是 1 毫米,10 毫米是 1 厘米,10 厘米是 1 分米,10 分米是 1 米。
尺子的排列结构和数组是一样的,顺序排列。毫米在顺序排列,相对于厘米而言,也在顺序排列,相对于分米而言,还在顺序排列。
20 公分的钢尺,里面包含有两个元素,两个分米。只看分米,相当于1维数组。
再看分米,1 分米相当于 10 厘米,分米是一个数组,厘米也是一个数组。
再看厘米,1 厘米相当于 10 毫米。单一看,分米是一个数组,厘米是一个数组,毫米仍是一个数组。换而言之,20 公分的钢尺,也可称之为 200 毫米的钢尺。
通过写程序,调试,观察二维数组在内存中的分布
#include <stdio.h>
int main()
{
int ary[2][3] = {
{
1, 2, 3}, // ary[0]
{
4, 5, 6} // ary[1]
};
}
按 F10 ,进入单步调试,第一个元素 1, 2, 3 成功写入了内存
再按 F10,第二个元素 4, 5, 6 也成功写入了内存。通过观察框,可以看出,这两个元素相邻且连续,类型是一样的,都是放三个整形的数组。所以说,多维数组还是数组,满足数组的一切特性,以及寻址公式。
使用多维数组的注意点
在设计上一般不会用到很多维的数组,在设计中如果出现,使用三维数组以上时,往往要考虑设计上出现了问题。
一维表示线性,二维表示平面,三维表示立体。如果在程序中,根据业务要求,处理线性,平面,立体是可以理解的。
四维表示时间,五维几乎 99% 的都不理解是做什么的。所以当发现必须要用三维数组以上解决问题时,先冷静一下,重新思考,肯定有更好的方法解决这个问题。
二维数组和三维数组寻址公式
二维数组寻址公式
某类型二维数组,type ary[N][M] 。因为二维数组的元素是一维数组。根据数组这篇文章,讲解的一维数组寻址公式,类比得出。ary[x] 的地址是 (int)ary + sizeof(type[M])*x ,经过计算后,得到其元素一维数组的首地址。
编写程序,求 ary[1] 的地址,通过调试和汇编代码验证公式。
#include <stdio.h>
int main()
{
int ary[2][3] = {
{
1, 2, 3}, // ary[0]
{
4,