数组概念考察
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]
四、数组初始化规则
- 全局数组:未手动初始化时,所有元素默认值为0
- 局部数组:未手动初始化时,所有元素值为随机垃圾值
- 部分初始化:
int arr[5] = {1};→arr[0]=1,arr[1]~arr[4]均为0 - 空初始化:
int a[10] = {0};→ 所有元素都为0
五、数组操作的三大常见错误
- ❌ 数组名整体赋值:
ar1 = ar2;报错(数组名是地址常量,不能被修改) - ❌ 伪整体赋值:
ar1[100] = ar2[100];不是整体赋值,是越界访问 - ❌ 数组内容比较:
if(ar1 == ar2)比较的是两个数组的首地址,不是元素内容,结果永远为false
六、易错考察点
| 说法 | 对错 | 说明 |
|---|---|---|
| 数组名不能被赋值 | ✅ | 数组名是常量指针 |
| 长度为n的数组,下标范围0~n | ❌ | 0~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) 可以比较数组内容 | ❌ | 比较的是首地址,永远为假 |
评论已关闭