美文网首页从汇编到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]
    

    相关文章

      网友评论

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

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