GESP三级 数组核心考点总结

一、数组本质与基础定义

1. 本质

数组是存储于连续内存空间、具有相同数据类型的元素集合,是线性数据结构(元素按顺序前后排列)。

2. 正确定义语法

  • 标准:数据类型 数组名[常量表达式];
  • 初始化定义:

    • 部分初始化:int arr[5] = {1,2,3}; 未赋值元素自动补0
    • 自动推导长度:int arr[] = {1,2,3}; 长度为3
  • ✅ 数组大小可以是:整型常量、字符常量、bool常量(会自动类型转换)

    • 例:int ar7['a']; → 大小97('a'的ASCII码)
    • 例:int ar8[true]; → 大小1(true转成1)
  • ❌ 错误定义:

    • int a[]; 未指定长度也未初始化
    • int c[1.23]; 长度不能是浮点数
    • int[3] d; 语法错误
    • char dict_name[]={'chen','wang'}; 单引号只能存单个字符
    • int arr[3] = {1,2,3,4}; 初始化列表元素超过数组长度

3. 核心限制

  • 数组长度必须是编译时常量,不能用普通变量定义
  • 数组大小、类型声明后永久不可改变
  • 语法上允许定义长度为0的数组,但arr[0]访问仍属于越界

二、数组内存与大小计算

1. 内存特性

  • 所有元素在内存中连续存放
  • 下标顺序对应内存地址从低到高
  • 数组名是常量指针,指向数组首元素的地址,不能被赋值

2. 占用字节数计算

  • 公式:总字节数 = 元素个数 × 单个元素字节数
  • 示例:

    • long long array[] = {3,5,7,2}; → 4×8=32字节
    • int arr[] = {1,2,3}; → 3×4=12字节

三、下标与访问规则

1. 下标范围

  • 下标从 0 开始,长度为n的数组,合法下标:0 ~ n-1
  • 例:int arr[5]; 最后一个元素是arr[4]arr[5] 越界

2. 越界访问(高频)

  • 数组下标越界不会产生编译错误
  • 运行时是未定义行为:输出随机值、程序崩溃(RE运行时错误)、正常结束都可能
  • 真题:int a[10]={1,2,...10}; cout << a[10]; → 输出不确定的值

3. 特殊下标

  • 可以用字符、bool、表达式作为下标(本质转成整数)
  • 例:arr[3>2 ? 1 : 2]相当于arr[1]

四、数组初始化规则

  1. 全局数组:未手动初始化时,所有元素默认值为0
  2. 局部数组:未手动初始化时,所有元素值为随机垃圾值
  3. 部分初始化:int arr[5] = {1};arr[0]=1arr[1]~arr[4] 均为0
  4. 空初始化:int a[10] = {0}; → 所有元素都为0

五、数组操作的三大常见错误

  1. ❌ 数组名整体赋值:ar1 = ar2; 报错(数组名是地址常量,不能被修改)
  2. ❌ 伪整体赋值:ar1[100] = ar2[100]; 不是整体赋值,是越界访问
  3. ❌ 数组内容比较:if(ar1 == ar2) 比较的是两个数组的首地址,不是元素内容,结果永远为false

六、易错考察点

说法对错说明
数组名不能被赋值数组名是常量指针
长度为n的数组,下标范围0~n0~n-1
数组越界会编译报错编译不报错,运行时可能RE
数组元素在内存中可以不连续必须连续
int a[] = {1,2,3}; 合法自动推导长度为3
可以用字符作为数组下标本质用ASCII码
数组名输出第一个元素的值输出数组首地址
可以给数组整体赋值只能逐个元素赋值
局部数组未初始化默认值为0全局数组才是0,局部是随机值
int arr[5]={1,2,3}; 则arr[3]=0部分初始化未赋值元素补0
int arr[5]={1,2,3}; 则arr[5]合法arr[5]越界
if(ar1==ar2) 可以比较数组内容比较的是首地址,永远为假

标签: none

评论已关闭