Skip to content

数组

1. 数组声明和初始化

1.1 数组声明

1.2 数组初始化

  1. 字符串字面量初始化字符数组:可以把字符串字面量放在花括号里,但更多情况下省略。

    如果数组的大小未知,那么字符串字面量里面的每个字符(包括空终止字符)用来初始化数组的各个元素;如果数组的大小已知,允许数组大小比字符串字面量的大小少 1,此时数组里无空终止字符。

    c
    char arr1[] = "mdr";
    char arr2[] = { "mdr" };
    // arr1 和 arr2 为 { 'm', 'd', 'r', '\0' }
    
    char arr3[3] = "mdr";
    // arr3 为 { 'm', 'd', 'r' }
  2. 花括号环绕的初始化器列表初始化数组

    每个初始化器前面可以带一个形如 [ 下标 ] =指派符,指定这个初始化器初始化该数组的第 下标 个元素。如果一个初始化器无指派符,如果它是第一个初始化器则初始化下标为零的元素,否则初始化前一个初始化器初始化的元素的后一个元素。

    如果数组的大小未知,那么初始化器的最大下标会确定数组大小(也就是足够装得下数组里面的元素),同时在初始化过后,数组从不完整类型变成完整类型。

    c
    int arr1[3] = { 1, 2, 3 };
    int arr2[]  = { [2] = 5 };          // { 0, 0, 5 }
    int arr3[]  = { [2] = 5, 6, 7}      // { 0, 0, 5, 6, 7 }
    int arr4[]  = { 1, 2, 3, [2] = 5 }; // { 1, 2, 5 }

    用嵌套初始化器初始化数组的数组:

    c
    int arr[3][2] = { {1, 2}, {3, 4}, {5, 6} };
    int arr[3][2] = { {1}, {3, 4}, {[1] = 6} }; // { { 1, 0 }, { 3, 4 }, { 0, 6 } }

    如果嵌套的初始化器外围没有花括号,就会用尽可能多的初始化器依次初始化子数组的各个元素。

    c
    int arr1[3][2] = { 1, {2}, {3, 4} }; // { { 1, 0 }, { 2, 0 }, { 3, 4 } }
    int arr2[3][2] = { 1, 2, 3, 4 };     // { { 1, 2 }, { 3, 4 }, { 0, 0 } }

    指派符可以嵌套:

    c
    int arr1[3][2] = { [2][1] = 3 }; // { { 0, 0 }, { 0, 0 }, { 0, 3 } }