day45.多维数组

第45节:多维数组

1、多维数组的定义

比如:一个班5个组,每个组9个人:
int arr[45] 或者 int arr[5*9] 再或者可以:int arr[5][9]

比如:一个县有5个学校,每个学校有3个年级,每个年级有4个班,每个班有5个组,每个组有9个人:
int arr[5*3*4*5*9] 或者 int arr[5][3][4][5][9]

int arr[5][3][4][5][9] 这种类型称为多维数组。

2、多维数组的初始化
例子:
int arr[3][4]{
      {1,2,3,4},
      {4,5,6,7},
      {7,8,9,10}
};

现在要思考一个问题了:这个二维数组它在内存中如何排列的?是连续存储的,二维或者一维只是给使用者的一种概念,在底层编译完后,根本没有二维、三维、四维的说法。只有连续存储的概念,无论你是几维在内存中都是一个一个存取起来的。上面的例子存储形式是:

反汇编代码如下:
6:        int arr[3][4]={
7:            {1,2,3,4},
00401028   mov         dword ptr [ebp-30h],1
0040102F   mov         dword ptr [ebp-2Ch],2
00401036   mov         dword ptr [ebp-28h],3
0040103D   mov         dword ptr [ebp-24h],4
8:            {5,6,7,8},
00401044   mov         dword ptr [ebp-20h],5
0040104B   mov         dword ptr [ebp-1Ch],6
00401052   mov         dword ptr [ebp-18h],7
00401059   mov         dword ptr [ebp-14h],8
9:            {9,10,11,12}
00401060   mov         dword ptr [ebp-10h],9
00401067   mov         dword ptr [ebp-0Ch],0Ah
0040106E   mov         dword ptr [ebp-8],0Bh
00401075   mov         dword ptr [ebp-4],0Ch
10:       };

看到这里大家应该就明白了一维数组和二维数组存储的方式都是一样的,连续的存储。大家可能有疑问,为什么还要用二维数组和多维数组,干脆用一维数组算了。多维数组给我们的好处就是给使用的人比较方便。比如:我要才第2组第4个人是多少,这样如果使用一维数组的话就得查,如果使用二维数组的话马上一眼看过去就知道了。(以上例子:第2组第4个人就是8)

3、二维数组的读写
比如:一年有12月,每个月都有一个平均气温,存储5年的数据
int arr[5][12]={
  {1,2,1,4,5,6,7,8,9,1,2,3},
  {1,2,1,4,5,6,7,8,9,1,2,3},
  {1,2,1,4,5,6,7,8,9,1,2,3},
  {1,2,1,4,5,6,7,8,9,1,2,3},
  {1,2,1,4,5,6,7,8,9,1,2,3}

}


假设如果要取第1年第9个数据就是:arr[0][8]。如果要取第2年第8个数据就是 arr[1][7]。
编译器来查找数据是:arr[0*12+8] 和 arr[1*12+7]

4、多维数组的读写

比如:一共有5个班,每个班有4个组,每个组3个人

int arr[5][4][3] = {
    {{1,2,3}.{4,5,6},{7,8,9}{10,11,12}},
    {{13,14,15}.{16,17,18},{19,20,21}{22,23,24}},
    {{25,26,27},{28,29,30},{31,32,33},{34,35,36}},
    {{37,38,39},{40,41,42},{43,44,45},{46,47,48}},
    {{49,50,51},{52,53,54},{55,56,57},{58,59,60}}
}


假设要找的是第2班,第2个组,第2个人是:arr[1][1][1]。
编译器是怎么做的呢? arr[1*4*3+1*2+1]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

随行之旅

python国产化自动化

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值