数组
1. 数组声明和初始化
1.1 数组声明
1.2 数组初始化
字符串字面量初始化字符数组:可以把字符串字面量放在花括号里,但更多情况下省略。
如果数组的大小未知,那么字符串字面量里面的每个字符(包括空终止字符)用来初始化数组的各个元素;如果数组的大小已知,允许数组大小比字符串字面量的大小少 1,此时数组里无空终止字符。
cchar arr1[] = "mdr"; char arr2[] = { "mdr" }; // arr1 和 arr2 为 { 'm', 'd', 'r', '\0' } char arr3[3] = "mdr"; // arr3 为 { 'm', 'd', 'r' }
花括号环绕的初始化器列表初始化数组
每个初始化器前面可以带一个形如
[ 下标 ] =
的 指派符,指定这个初始化器初始化该数组的第 下标 个元素。如果一个初始化器无指派符,如果它是第一个初始化器则初始化下标为零的元素,否则初始化前一个初始化器初始化的元素的后一个元素。如果数组的大小未知,那么初始化器的最大下标会确定数组大小(也就是足够装得下数组里面的元素),同时在初始化过后,数组从不完整类型变成完整类型。
cint 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 }
用嵌套初始化器初始化数组的数组:
cint arr[3][2] = { {1, 2}, {3, 4}, {5, 6} }; int arr[3][2] = { {1}, {3, 4}, {[1] = 6} }; // { { 1, 0 }, { 3, 4 }, { 0, 6 } }
如果嵌套的初始化器外围没有花括号,就会用尽可能多的初始化器依次初始化子数组的各个元素。
cint 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 } }
指派符可以嵌套:
cint arr1[3][2] = { [2][1] = 3 }; // { { 0, 0 }, { 0, 0 }, { 0, 3 } }