数组
数组的初始化
cpp
// 1. 声明时初始化:使用初始化列表提供初始元素,完全初始化
int array[6] {2, 6, 0, 8, 5, 4};
// 2. 声明时初始化:当初始化列表提供元素小于数组大小,部分初始化,其余元素初始化为 0
int array1[6] {0}; // 全部元素初始化为 0
int array2[6] {}; // 零初始化,等价上面写法
int array3[6] {1, 2}; // 前两个元素初始化,后四个元素默认为 0
// 3. 自动推导元素数量:若不指定数组大小,编译器可根据初始化的值的数量自动推导
int array3[] {1, 2, 3, 4, 5, 6}; // 编译器推导出 array3 有 6 个元素
// 扩展:字符数组的初始化,编译器会自动在末尾添加空字符 \0
char str1[6] = "Hello"; // str = {'H', 'e', 'l', 'l', 'o', '\0'}
char str2[] = "World"; // 编译器推导出 str2 有 6 个元素(包含 '\0')
数组名与指针
数组名本身就是一个[[const#常量指针|常量指针]],指向数组首元素。
cpp
int arr[] {1, 2, 3, 4};
// 1. 求数组占用内存大小
sizeof(arr)
// 数组第一个元素占用内存大小
sizeof(arr[0])
// 求数组长度
size_t len = sizeof(arr) / sizeof(arr[0]);
// 2. 查看数组首地址
cout << arr << endl; // 0xacf3ff970, 将数组名解释为其第一个元素地址
cout << &arr[0] << endl; // 0xacf3ff970, 数组第一个元素的地址
// 3. 数组名与指针的关系
int *p = arr; // 等同于 int *p = &arr[0];
arr[i]; // 等价于 *(arr + i)
p[i]; // 等价于 *(p + i)arr + i:指向第i 个元素,即&arr[i]。-
*(arr + i):等价于arr[i],体现数组下标访问的本质是指针偏移。
二维数组
cpp
int matrix[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
// 使用两个下标访问:
for (int i = 0; i < 2; ++i)
for (int j = 0; j < 3; ++j)
cout << matrix[i][j] << endl;二维数组初始化规则:
- 未被显式初始化的元素会被自动初始化为 0
- 每行剩余未初始化的元素会被初始化为 0
- 剩余的整行如果未初始化也会被置于 0
函数与数组
数组作为函数参数时退化成指针:
cpp
// 函数修改数组函数原型
void print_arr(int arr[], int n);
// 等价于
void print_arr(int *arr, int n);
// 函数不修改数组,原型如下
void print_arr(const int arr[], int n);- 在函数参数中,
int arr[] 会自动退化为int *arr ,因此无法在函数内部通过sizeof(arr)获取数组长度。 []指出arr是一个数组,方括号为空表明可将任意长度数组传递给该函数。