一维数组

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]<<" ";
 }