1. 数组的本质
- 数组是一组相同类型数据的集合
- 在内存中连续存储,每个元素占用相同大小的内存空间
- 数组名代表数组首元素的地址(常量指针)
2. 数组的特性
特性1:固定大小
- 定义后大小不可改变
- 大小必须是编译时常量(C++标准)
特性2:类型一致
- 所有元素必须是同一数据类型
特性3:连续存储
- 元素在内存中地址连续
- 可通过首地址+偏移量快速访问
特性4:随机访问
- 通过下标直接访问任意元素,时间复杂度O(1)
3. 存储结构
int arr[5] = {10, 20, 30, 40, 50};
内存布局:
地址: 1000 1004 1008 1012 1016
+------+------+------+------+------+
arr: | 10 | 20 | 30 | 40 | 50 |
+------+------+------+------+------+
索引: 0 1 2 3 4
4. 下标访问的本质(初学者了解)
arr[i] 等价于 *(arr + i)
- arr是首地址
- i是偏移量
- []是运算符,执行指针算术和解引用
5. 边界概念
定义:int arr[5];
合法下标范围:0 ~ 4(共5个元素)
重要概念:
- 编译器不检查数组边界
- 访问越界是未定义行为
- 越界可能:覆盖其他变量、程序崩溃、隐藏bug
6. 初始化的规则
// 完全初始化:明确所有元素的值
int a[3] = {1, 2, 3};
// 部分初始化:未指定的元素自动初始化为0
int b[5] = {1, 2}; // {1,2,0,0,0}
// 默认初始化:不初始化,值为随机(垃圾值)
int c[5];
// 零初始化:所有元素为0
int d[5] = {0};
// 自动推断大小
int e[] = {1,2,3}; // 大小推断为3
7. 初始化vs赋值
初始化:在创建时赋予初值
赋值:创建后修改值
数组定义后不能整体赋值:
int a[3] = {1,2,3};
int b[3];
b = a; // ❌ 错误!数组不能整体赋值
8. 安全使用原则
1. 永远确保下标不越界
2. 永远初始化数组(避免随机值)
9. 常用数组代码模版
int n,a[100005]={};
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
cout<<a[i]<<" ";
}