C 语言入门:数组 + 循环语句详解(核心知识点 + 实战练习)

前言

C 语言的数组循环语句是入门阶段的两大核心知识点:数组解决「批量数据存储」的问题,循环解决「重复操作数据」的问题,二者结合可以高效处理批量数据(如遍历数组、统计数据、查找数据等)。

一、数组:批量存储同类型数据的工具

在没有数组的情况下,定义大量同类型变量会非常繁琐,而数组可以批量定义、有序存储同类型数据,是处理批量数据的基础。

1.1 为什么需要数组?

假设要存储 30 个学生的成绩,无数组时需逐个定义变量:

运行

int score1;
int score2;
// ... 省略26个变量
int score30;

这种方式不仅代码冗余,还无法批量操作数据。而数组可以批量定义、有序存储、批量操作,完美解决上述问题。

1.2 数组的核心分类

入门阶段重点掌握两类数组,本文聚焦一维数组

  • 一维数组:线性存储一组同类型数据(如 30 个学生的成绩);
  • 二维数组:存储多行多列的同类型数据(如班级成绩单,行代表学生、列代表科目)。

1.3 一维数组的核心语法

1.3.1 定义语法

数组定义需遵循固定格式,语法如下:

plaintext

类型说明符  数组名  [常量表达式]
   (1)        (2)       (3)
  • 类型说明符:指定数组元素的统一数据类型(如intfloatchar);
  • 数组名:标识符,命名规则与变量一致(见名知意,如scorearr);
  • [常量表达式]:数组长度(元素个数),必须是整型常量(如1020),编译时确定大小。

合法定义示例

// 存储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 数组的核心特性
  1. 连续性:内存中开辟连续空间,元素按顺序存放;
  2. 单一性:所有元素类型统一;
  3. 有序性:元素按下标顺序排列;
  4. 不可整体操作:只能操作单个元素,需结合循环实现批量操作。

二、循环语句:重复操作数据的核心工具

循环是「重复执行某段代码」的手段,结合数组可以实现批量数据处理。C 语言的循环方式包括goto(慎用)和三大循环语句(forwhiledo-while)。

2.1 循环的核心概念

循环的本质是按条件重复执行代码,必须包含四大要素(避免死循环):

  1. 初始条件:循环变量的初始值(仅执行 1 次);
  2. 结束条件:循环终止的判断条件(结果为假则终止);
  3. 更新操作:更新循环变量,确保最终满足结束条件;
  4. 循环体:重复执行的核心代码。

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 以内的回文数,存入数组后统一打印。

四、新手避坑指南

  1. 数组下标越界:遍历数组时,结束条件需为i < 数组长度(而非i <= 数组长度);
  2. 循环头误加分号for(;;);while();会导致循环体为空,陷入死循环;
  3. 忘记更新循环变量:循环变量不更新,无法满足结束条件,陷入死循环;
  4. 数组整体赋值:数组定义后不能用a = {1,2,3};,需逐个元素赋值;
  5. 判断条件错误:将「等于 ==」写成「赋值 =」,推荐「常量在前,变量在后」(如3 == i%3)。

五、总结

  1. 数组是批量存储同类型数据的工具,核心是「下标访问元素」,需结合循环实现批量操作;
  2. 循环语句是重复执行代码的核心,三大循环各有侧重,for最常用,while适合未知次数,do-while至少执行一次;
  3. 数组 + 循环是 C 语言入门的核心组合,可实现批量数据的遍历、筛选、统计、排序等操作;
  4. 掌握这两个知识点的关键是多做实战练习,从简单的数组遍历到复杂的回文数筛选,逐步夯实编程思维。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐