Skip to content

数组 ​

数组的初始化 ​

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;

二维数组初始化规则:

  1. 未被显式初始化的元素会被自动初始化为 0
  2. 每行剩余未初始化的元素会被初始化为 0
  3. 剩余的整行如果未初始化也会被置于 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 是一个数组,方括号为空表明可将任意长度数组传递给该函数。