通信小白勇闯Linux的DAY6
数组定义需遵循固定格式,语法如下:plaintext类型说明符 数组名 [常量表达式]类型说明符:指定数组元素的统一数据类型(如intfloatchar数组名:标识符,命名规则与变量一致(见名知意,如scorearr[常量表达式]:数组长度(元素个数),必须是整型常量(如1020),编译时确定大小。合法定义示例// 存储10个整数的数组// 存储5个浮点数的数组初始化方式语法示例说明全部初始化大括
C 语言入门:数组 + 循环语句详解(核心知识点 + 实战练习)
前言
C 语言的数组和循环语句是入门阶段的两大核心知识点:数组解决「批量数据存储」的问题,循环解决「重复操作数据」的问题,二者结合可以高效处理批量数据(如遍历数组、统计数据、查找数据等)。
一、数组:批量存储同类型数据的工具
在没有数组的情况下,定义大量同类型变量会非常繁琐,而数组可以批量定义、有序存储同类型数据,是处理批量数据的基础。
1.1 为什么需要数组?
假设要存储 30 个学生的成绩,无数组时需逐个定义变量:
运行
int score1;
int score2;
// ... 省略26个变量
int score30;
这种方式不仅代码冗余,还无法批量操作数据。而数组可以批量定义、有序存储、批量操作,完美解决上述问题。
1.2 数组的核心分类
入门阶段重点掌握两类数组,本文聚焦一维数组:
- 一维数组:线性存储一组同类型数据(如 30 个学生的成绩);
- 二维数组:存储多行多列的同类型数据(如班级成绩单,行代表学生、列代表科目)。
1.3 一维数组的核心语法
1.3.1 定义语法
数组定义需遵循固定格式,语法如下:
plaintext
类型说明符 数组名 [常量表达式]
(1) (2) (3)
- 类型说明符:指定数组元素的统一数据类型(如
int、float、char); - 数组名:标识符,命名规则与变量一致(见名知意,如
score、arr); - [常量表达式]:数组长度(元素个数),必须是整型常量(如
10、20),编译时确定大小。
合法定义示例:
// 存储10个整数的数组
int score[10];
// 存储5个浮点数的数组
float price[5];
1.3.2 数组的初始化(定义时赋值)
数组定义后可通过初始化赋值,支持多种方式:
| 初始化方式 | 语法示例 | 说明 |
|---|---|---|
| 全部初始化 | int a[10] = {1,2,...,10}; |
大括号内值与数组长度一致,依次赋值 |
| 部分初始化 | int a[10] = {1,2,3,4,5}; |
前 5 个元素赋值,剩余默认值为 0 |
| 不初始化 | int a[10]; |
元素为随机垃圾值,不可直接使用 |
| 默认全 0 初始化 | int a[10] = {}; |
所有元素赋值为 0 |
| 全 0 初始化特例 | int a[10] = {0}; |
所有元素赋值为 0 |
| 省略长度初始化 | int a[] = {1,3,4}; |
编译器自动确定长度(此处为 3) |
注意:数组定义后不能通过大括号整体赋值(如a = {1,2,3};非法)。
1.3.3 数组的使用(访问元素)
数组元素通过「数组名 + 下标」访问,语法:
数组名[下标]
- 下标:从 0 开始编号,取值范围为
[0, 数组长度-1]; - 下标越界:编译器不检查,需自行规避(否则访问垃圾数据或崩溃);
- 数组元素:等价于普通变量,可参与赋值、运算、输入输出。
示例:
int a[5] = {1,2,3,4,5};
// 访问第1个元素(下标0),输出1
printf("%d\n", a[0]);
// 给第5个元素(下标4)赋值为6
a[4] = 6;
1.3.4 数组的核心特性
- 连续性:内存中开辟连续空间,元素按顺序存放;
- 单一性:所有元素类型统一;
- 有序性:元素按下标顺序排列;
- 不可整体操作:只能操作单个元素,需结合循环实现批量操作。
二、循环语句:重复操作数据的核心工具
循环是「重复执行某段代码」的手段,结合数组可以实现批量数据处理。C 语言的循环方式包括goto(慎用)和三大循环语句(for、while、do-while)。
2.1 循环的核心概念
循环的本质是按条件重复执行代码,必须包含四大要素(避免死循环):
- 初始条件:循环变量的初始值(仅执行 1 次);
- 结束条件:循环终止的判断条件(结果为假则终止);
- 更新操作:更新循环变量,确保最终满足结束条件;
- 循环体:重复执行的核心代码。
2.2 goto 语句(跳转实现循环,慎用)
goto是无条件跳转语句,可实现循环,但破坏结构化编程思想,行业内多数禁用。
语法:
// 定义标号(以冒号结尾)
标号名:
代码块;
// 跳转到标号
goto 标号名;
示例(打印 1~10):
int i = 1;
print:
if(i > 10) goto end;
printf("%d ", i);
i++;
goto print;
end:
2.3 三大循环语句(核心重点)
2.3.1 for 循环(最常用,范围明确)
for循环将循环四要素集中在一行,适合已知循环次数 / 范围的场景。
语法:
for (表达式1; 表达式2; 表达式3)
{
循环体;
}
- 表达式 1:初始条件(仅执行 1 次);
- 表达式 2:结束条件(每次循环前判断);
- 表达式 3:更新操作(每次循环体后执行)。
执行流程:1→2→3→4→2→3→4...(for (1;2;4) {3;})。
示例:数组遍历 + 求和:
// 定义数组并初始化
int arr[5] = {1,2,3,4,5};
int sum = 0;
// for循环遍历数组,累加求和
for (int i=0; i<5; i++)
{
sum += arr[i];
}
printf("数组和为:%d\n", sum); // 输出15
2.3.2 while 循环(结束条件明确,次数未知)
while循环结构简洁,适合循环次数未知、结束条件明确的场景。
语法:
// 初始条件
循环变量初始化;
while (表达式) // 结束条件
{
循环体;
更新操作; // 必须放在循环体内
}
执行流程:初始化→判断→执行→更新→判断...(先判断,后执行)。
示例:数组遍历 + 查找最大值:
int arr[5] = {3,1,4,2,5};
int max = arr[0];
int i = 1;
// while循环找最大值
while (i < 5)
{
if (arr[i] > max) max = arr[i];
i++;
}
printf("数组最大值:%d\n", max); // 输出5
2.3.3 do-while 循环(先执行,后判断,至少执行 1 次)
do-while是唯一「先执行、后判断」的循环,适合必须先执行一次操作的场景。
语法:
// 初始条件
循环变量初始化;
do
{
循环体; // 至少执行1次
更新操作;
} while (表达式); // 末尾加分号
执行流程:初始化→执行→更新→判断→执行...。
示例:数组元素逆序(先执行一次交换):
int arr[4] = {1,2,3,4};
int i = 0;
int len = 4;
do
{
// 交换arr[i]和arr[len-1-i]
int t = arr[i];
arr[i] = arr[len-1-i];
arr[len-1-i] = t;
i++;
} while (i < len/2);
// 输出逆序后的数组:4 3 2 1
for (int j=0; j<4; j++) printf("%d ", arr[j]);
2.3.4 循环语句的选用原则
- for:优先选用,适合范围明确、次数已知的场景(如数组遍历);
- while:适合次数未知、结束条件明确的场景(如键盘输入);
- do-while:适合必须先执行一次的场景(如开机自检、密码验证)。
2.4 循环辅助语句:break 和 continue
2.4.1 break 语句
- 作用:终止本层循环,直接跳出到循环后的代码;
- 示例:数组遍历中找到目标值则终止循环:
int arr[5] = {2,4,6,8,10}; int target = 6; for (int i=0; i<5; i++) { if (arr[i] == target) { printf("找到目标值,下标为:%d\n", i); break; // 终止循环 } }
2.4.2 continue 语句
- 作用:终止本次循环的后续代码,直接进入下一次循环;
- 示例:数组遍历中跳过偶数:
int arr[5] = {1,2,3,4,5}; for (int i=0; i<5; i++) { if (arr[i] % 2 == 0) { continue; // 跳过本次循环,不打印偶数 } printf("%d ", arr[i]); // 输出1 3 5 }
三、数组 + 循环实战练习
练习 1:数组逆序(首尾交换)
需求:将数组{1,2,3,4,5,6,7,8,9,10}逆序为{10,9,...,1}。
练习 2:数组元素筛选(找出能被 3 整除的数)
需求:从键盘输入 10 个整数,存入数组,找出能被 3 整除的数。
练习 3:打印 1000 以内的回文数(结合数组存储)
需求:找出 1000 以内的回文数,存入数组后统一打印。
四、新手避坑指南
- 数组下标越界:遍历数组时,结束条件需为
i < 数组长度(而非i <= 数组长度); - 循环头误加分号:
for(;;);、while();会导致循环体为空,陷入死循环; - 忘记更新循环变量:循环变量不更新,无法满足结束条件,陷入死循环;
- 数组整体赋值:数组定义后不能用
a = {1,2,3};,需逐个元素赋值; - 判断条件错误:将「等于 ==」写成「赋值 =」,推荐「常量在前,变量在后」(如
3 == i%3)。
五、总结
- 数组是批量存储同类型数据的工具,核心是「下标访问元素」,需结合循环实现批量操作;
- 循环语句是重复执行代码的核心,三大循环各有侧重,
for最常用,while适合未知次数,do-while至少执行一次; - 数组 + 循环是 C 语言入门的核心组合,可实现批量数据的遍历、筛选、统计、排序等操作;
- 掌握这两个知识点的关键是多做实战练习,从简单的数组遍历到复杂的回文数筛选,逐步夯实编程思维。
更多推荐

所有评论(0)