第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}
编译器来查找数据是:arr[0*12+8] 和 arr[1*12+7]
4、多维数组的读写
{{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]
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}
}
编译器来查找数据是: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]