C语言10 多维数组
多维数组的定义
-
比如一个班有5个组,每个组有9个人
int arr[45] 或者 intarr[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] ,又成为多维数组.
多维数组的初始化
int arr[3][4] = {
{1,2,3,4},
{5,6,7,8},
{9,7,6,5}
};
多维数组的存储方式
int arr[3][4];
image
反汇编对比
8: int arr[3*4] = {1,2,3,4,5,6,7,8,9,10,11,12};
00401028 C7 45 D0 01 00 00 00 mov dword ptr [ebp-30h],1
0040102F C7 45 D4 02 00 00 00 mov dword ptr [ebp-2Ch],2
00401036 C7 45 D8 03 00 00 00 mov dword ptr [ebp-28h],3
0040103D C7 45 DC 04 00 00 00 mov dword ptr [ebp-24h],4
00401044 C7 45 E0 05 00 00 00 mov dword ptr [ebp-20h],5
0040104B C7 45 E4 06 00 00 00 mov dword ptr [ebp-1Ch],6
00401052 C7 45 E8 07 00 00 00 mov dword ptr [ebp-18h],7
00401059 C7 45 EC 08 00 00 00 mov dword ptr [ebp-14h],8
00401060 C7 45 F0 09 00 00 00 mov dword ptr [ebp-10h],9
00401067 C7 45 F4 0A 00 00 00 mov dword ptr [ebp-0Ch],0Ah
0040106E C7 45 F8 0B 00 00 00 mov dword ptr [ebp-8],0Bh
00401075 C7 45 FC 0C 00 00 00 mov dword ptr [ebp-4],0Ch
10: int arr[3][4] = {
11: {1,2,3,4},
00401028 C7 45 D0 01 00 00 00 mov dword ptr [ebp-30h],1
0040102F C7 45 D4 02 00 00 00 mov dword ptr [ebp-2Ch],2
00401036 C7 45 D8 03 00 00 00 mov dword ptr [ebp-28h],3
0040103D C7 45 DC 04 00 00 00 mov dword ptr [ebp-24h],4
12: {5,6,7,8},
00401044 C7 45 E0 05 00 00 00 mov dword ptr [ebp-20h],5
0040104B C7 45 E4 06 00 00 00 mov dword ptr [ebp-1Ch],6
00401052 C7 45 E8 07 00 00 00 mov dword ptr [ebp-18h],7
00401059 C7 45 EC 08 00 00 00 mov dword ptr [ebp-14h],8
13: {9,10,11,12}
00401060 C7 45 F0 09 00 00 00 mov dword ptr [ebp-10h],9
00401067 C7 45 F4 0A 00 00 00 mov dword ptr [ebp-0Ch],0Ah
0040106E C7 45 F8 0B 00 00 00 mov dword ptr [ebp-8],0Bh
00401075 C7 45 FC 0C 00 00 00 mov dword ptr [ebp-4],0Ch
14: };
通过观察我们发现,所谓多维数组和一维数组,在内存分配上完全相同
所以
int arr[3*4] 完全等价于 int arr[3][4]
使用多维数组的原因是,使用方便 寻找元素非常方便,在底层方面和一维数组没有任何的区别
多维数组的读写
比如:一年有12个月,每个月都有一个平均气温,存储5年的数据
int arr[5][12] = {
{1,2,1,4,5,6,7,8,9,1,2,3}, //0
{1,2,1,4,5,6,7,8,9,1,2,3}, //1
{1,2,1,4,5,6,7,8,9,1,2,3}, //2
{1,2,1,4,5,6,7,8,9,1,2,3}, //3
{1,2,1,4,5,6,7,8,9,1,2,3} //4
};
===
获取第一年第9个月的数据:
arr[0][8]
编译器是如何找到这个数据的:
arr[0*12+8]
===
获取第二年第8个月的数据:
arr[1][7]
编译器是如何找到这个数据的
arr[1*12+7]
多维数组的存储于读写
假设一共有5个班,每个班4个组,每组3个人
int arr[5][4][3] = {
{{1,2,3},{4,5,6},{7,8,9},{11,12,14}},
{{11,12,13},{14,15,16},{17,18,19},{111,112,114}},
{{21,22,23},{24,25,26},{27,28,29},{211,212,214}},
{{31,32,33},{34,35,36},{37,38,39},{311,312,314}},
{{41,42,43},{44,45,46},{47,48,49},{411,412,414}},
};
编译器如何分配空间?
如果获取第2个班级、第3组、第2个人的年龄: arr[1][2][1]
编译器的计算: arr[1*4*3 + 2*3 + 1]
如果获取第4个班级、第4组、第3个人的年龄: arr[3][3][2]
编译器如何计算?
arr[3*4*3 + 3*3 + 3]
网友评论