一、数组是什么?(核心定义)

数组:同一数据类型、连续内存、批量存储的一组变量

通俗理解:

普通变量 = 单个盒子

数组 = 一排连续、大小相同、编号有序的盒子

数组三大特性(必考)

  • 类型统一:数组里所有元素必须是同一种类型(int就全int,char就全char)

  • 内存连续:所有元素地址紧紧相连,没有空隙

  • 下标从0开始:第1个元素下标是0,不是1


二、一维数组(最基础、最重要)

1. 一维数组定义语法

数据类型 数组名[数组长度];

示例:int arr[5]; // 定义能存5个int的数组

2. 一维数组初始化(四种写法)

写法1:完全初始化(填满)

int arr[5] = {1,2,3,4,5};

写法2:部分初始化(剩余自动补0)【超级高频考点】

int arr[5] = {1,2}; // 结果:1 2 0 0 0 // 未初始化元素默认 = 0

写法3:省略长度初始化(编译器自动数个数)

int arr[] = {1,3,5}; // 自动长度 = 3

写法4:完全不初始化

int arr[5]; // 局部数组:随机垃圾值 // 全局数组:默认全0

3. 数组访问、遍历

访问语法:数组名[下标]

下标范围:0 ~ 长度-1

标准遍历模板(以后写代码永远这套):

for(int i = 0; i < 5; i++) { printf("%d ", arr[i]); }

4. 一维数组经典易错点

  • 数组下标不能越界(越界不报错、乱改内存、程序崩溃)

  • 数组长度C89必须是常量

  • C99支持变量长度数组VLA(考试常考区别)

  • 数组名代表首元素地址,是常量地址,不能赋值


三、数组内存深度理解(考试大题考点)

1. 数组地址连续

arr[0]、arr[1]、arr[2]... 地址依次相隔 一个元素字节大小

int数组:每个元素相差4字节

char数组:每个元素相差1字节

2. sizeof 求数组总大小(超级重点)

sizeof(数组名) = 整个数组总字节数

求数组元素个数公式(万能公式):

int len = sizeof(arr) / sizeof(arr[0]);

示例:

int arr[5]; // sizeof(arr) = 20 // sizeof(arr[0]) = 4 // 长度 = 5

四、字符数组与字符串(最大考点、最容易混)

1. 普通字符数组

char ch[3] = {'a','b','c'};

没有 \0,不是字符串,不能用%s打印

2. 字符串字符数组(自带 \0)

char str[4] = {"abc"}; // 内存:a b c \0

双引号初始化自动补 \0

3. strlen 和 sizeof 绝杀区别(必考)

  • strlen():有效字符长度,不计\0,需要头文件 string.h

  • sizeof:数组总内存大小,包含\0

例子:

char s[] = "hi"; strlen(s) // 2 sizeof(s) // 3 (h i \0)

五、二维数组(表格数组)

1. 定义

类型 数组名[行][列]

int arr[2][3]; // 2行3列

2. 初始化方式

完整初始化:

int a[2][3] = { {1,2,3}, {4,5,6} };

简写初始化:

int a[2][3] = {1,2,3,4,5,6};

部分初始化,剩余补0:

int a[2][3] = {1,2};

3. 二维数组唯一规则(考试死记)

行可以省略,列绝对不能省略!

int a[][3] = {1,2,3,4}; // 合法 // int a[2][] = ... 非法!

4. 二维数组遍历模板

for(int i = 0; i < 2; i++) { for(int j = 0; j < 3; j++) { printf("%d ", arr[i][j]); } }

六、数组与函数(超级重难点)

1. 数组传参本质

数组传参不会传整个数组,只会传首元素地址!

所以:函数内sizeof(数组) 得不到真实长度(永远是4或8字节)

2. 数组做函数参数两种写法

void fun(int arr[]) void fun(int *arr)

两种写法完全等价

3. 规范写法(必须手动传长度)

void printArr(int arr[], int len) { for(int i = 0; i < len; i++) printf("%d ", arr[i]); }

七、数组核心考点总结(考前必背)

  • 数组下标从0开始,下标越界不报错、运行异常

  • 局部数组未初始化:随机值;全局数组默认0

  • 部分初始化,未赋值元素自动补0

  • 字符串双引号自动补\0,字符数组单引号不会

  • strlen不计\0,sizeof包含\0

  • 二维数组:行可省,列不可省

  • 数组传参退化为指针,丢失长度信息,必须手动传len

  • C89数组长度必须常量;C99支持变量长度VLA


八、新手必会数组经典题型

1. 数组遍历、求和、平均值

2. 找最大值、最小值

3. 数组反转、排序

4. 字符数组字符串输入输出、长度计算

5. 二维矩阵遍历、对角线求和

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐