二维数组

  • 一维数组与多维数组在反汇编上没有区别

    1
    2
    3
    4
    5
    6
    7
    8
    void Fun() {
    int arr[3][4] = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
    };
    //int arr[12] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
    }

    两种写法汇编是一样的:

  • 数量如果不够,其他的会用 0 补全

    1
    2
    3
    4
    5
    6
    7
    void Fun() {
    int arr[3][4] = {
    {1, 2},
    {5},
    {9}
    };
    }


    与普通的变量赋值不同,我们知道如果不给定初始值,全局变量默认初值 0,局部变量则是随机(残留的垃圾数据)。但是数组不一样,但凡定义了数组中的一个值,其余的值编译器就都会自动赋 0 了,可以联想到很常见的一个给数组赋初值的语句:int arr[100] = {0};

  • 不允许超过维度的最大长度

  • 可以省略里面的 {}

    1
    int arr[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
  • 可以省略第一维的值(第二维不可以省略)

    1
    int arr[][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};

课后作业

前五题就不做了,直接看一下第六题

  1. 数组一:[3, 5, 7, 9, 12, 25, 34, 55]数组二:[4, 7, 9, 11, 13, 16]。将两个数组中的所有数据进行从小到大的排序,存储到另一个数组中

    观察到两个数组内的数据都是有序的,所以就省事了

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #include <stdio.h>

    void Func() {
    int arr1[8] = {3, 5, 7, 9, 12, 25, 34, 55};
    int arr2[6] = {4, 7, 9, 11, 13, 16};
    int arr[14] = {0};
    int cnt = 0, cnt1 = 0, cnt2 = 0;
    while (cnt1 < 8 && cnt2 < 6) {
    if (arr1[cnt1] <= arr2[cnt2]) arr[cnt++] = arr1[cnt1++];
    else arr[cnt++] = arr2[cnt2++];
    }
    while (cnt1 < 8) arr[cnt++] = arr1[cnt1++];
    while (cnt2 < 6) arr[cnt++] = arr2[cnt2++];
    int i;
    for (i = 0; i < 14; i++) printf("%d ", arr[i]);
    }

    int main(int argc, char* argv[]) {
    Func();
    return 0;
    }