美文网首页从汇编到C++
C语言10 多维数组

C语言10 多维数组

作者: Asura_Luo | 来源:发表于2018-05-04 02:47 被阅读0次

C语言10 多维数组

多维数组的定义

  1. 比如一个班有5个组,每个组有9个人

    int arr[45] 或者 intarr[5*9] 或者 int arr[5][9]
    
    
  2. 比如一个县有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]

相关文章

  • 0基础学习C语言第七章:数组(2)

    C语言 多维数组 C 语言支持多维数组。多维数组声明的一般形式如下: type name[size1][size2...

  • C语言10 多维数组

    C语言10 多维数组 多维数组的定义 比如一个班有5个组,每个组有9个人int arr[45] 或者 intarr...

  • [进阶]C++:数组形参

    使用表准库规范 传递多维数组 C++语言中实际上没有真正的多维数组,多为的多维数组实际上是数组的数组 等价定义 m...

  • [基础]C++:名字的作用域

    使用表准库规范 传递多维数组 C++语言中实际上没有真正的多维数组,多为的多维数组实际上是数组的数组 等价定义 m...

  • c语言多维数组

    由于简书不能很好支持 LaTeX,需要原文档的可以加我QQ 596928539. 或者只下载PDF版 链接:ht...

  • 用Macro来定义矩阵

    2020/6/10C语言里函数参数只能用指针来表示一维数组,对于二维或多维数组可以通过Macro来实现,使代码简洁...

  • 指针数组和数组指针

    指针数组|存储指针的数组 在C语言和C++语言中,数组元素全为指针的数组称为指针数组。 例如:int *p[10]...

  • 静心沉淀,厚积薄发

    今天主要是看来c语言中关于数组的知识,数组按照空间大小的不同,数组分为一维数组,二维数组,多维数组,按照元素种...

  • Shell---数组

    bash支持一维数组(不支持多维数组),并且没有限定数组的大小。类似与C语言,数组元素的下标由0开始编号。获取数组...

  • shell变量的数据类型之数组

    bash支持一维数组(不支持多维数组),并且没有限定数组的大小。 类似于 C 语言,数组元素的下标由 0 开始编号...

网友评论

    本文标题:C语言10 多维数组

    本文链接:https://www.haomeiwen.com/subject/eoyrrftx.html