【C语言数组入门】从零基础到实战应用

张开发
2026/4/13 2:46:10 15 分钟阅读

分享文章

【C语言数组入门】从零基础到实战应用
文章目录一、为什么要学数组1.1 数组解决了什么痛点批量管理数据的优势1.2 数组的入门级应用场景成绩管理、排序、大作业实现等二、数组的核心基础概念2.1 数组的定义与本质2.2 数组的4个核心特点2.3 数组 vs 普通变量本质区别是什么三、数组的基础语法与实操C语言为例3.1 数组的定义与初始化3.1.1 静态数组的标准定义语法3.1.2 3种初始化方式完全初始化/部分初始化/省略长度初始化3.1.3 初始化的常见错误避坑3.2 数组元素的访问与遍历3.2.1 下标访问的原理3.2.2 数组的2种遍历方式for/while循环3.2.3 【重点】数组越界问题后果避免方法3.3 数组的入门级基础操作3.3.1 数组元素的查找按值/按下标3.3.2 数组的求和、求最大值/最小值3.3.3 数组的逆序反转操作四、数组经典入门算法初阶必掌握4.1 冒泡排序数组最经典入门排序4.2 选择排序对比冒泡入门级排序4.3 数组去重有序数组五、新手必踩的数组坑避坑指南5.1 数组下标越界最常见5.2 数组初始化的隐藏规则5.3 【C语言重点】数组传参的陷阱5.4 数组名的本质常量指针不能被赋值六、数组初阶实战小案例新手友好6.1 学生成绩管理系统6.2 用数组实现斐波那契数列6.3 数组实现扫雷/五子棋棋盘七、总结与进阶方向7.1 数组初阶核心知识点梳理7.2 接下来可以学什么一、为什么要学数组对于刚学 C 语言的同学来说数组是第一个真正意义上的数据结构也是编程从「零散变量」走向「批量数据处理」的关键一步1.1 数组解决了什么痛点批量管理数据的优势先举一个例子老师让你统计班级 50 名同学的成绩求平均分、最高分// 噩梦级写法定义50个变量intscore1,score2,score3,...,score50;为追求简洁、快速可以直接使用数组。1.2 数组的入门级应用场景成绩管理、排序、大作业实现等数组是编程最基础、最常用的工具高频使用场景学生成绩管理录入、统计、排序数字处理求和、找最值、逆序、去重算法入门排序、查找二、数组的核心基础概念2.1 数组的定义与本质官方定义数组是相同数据类型的元素按照顺序在内存中连续存储的集合。通俗理解把数组想象成一排连续的储物柜每个柜子存一个数据所有柜子的类型一致2.2 数组的4个核心特点1.连续存储数组元素在内存中挨在一起没有空隙2.类型统一一个数组只能存一种类型全是 int、全是 char 等3.下标从 0 开始第一个元素下标是 0第二个是 1最后一个是长度-14.长度固定数组定义后大小不能修改静态数组)2.3 数组 vs 普通变量本质区别是什么对比项数组普通变量存储数据单个数据一组数据命名独立命名统一命名下标命名处理方式单独操作循环批量操作适用场景单个场景批量数据三、数组的基础语法与实操C语言为例这是本章的核心包含所有新手必须掌握的语法和代码。3.1 数组的定义与初始化3.1.1 静态数组的标准定义语法// 格式数据类型 数组名[数组长度];intscores[5];// 定义一个整型数组能存5个成绩charname[20];// 定义一个字符数组存名字floatheights[10];// 定义一个浮点型数组存身高3.1.2 3种初始化方式完全初始化/部分初始化/省略长度初始化#includestdio.hintmain(){// 1. 完全初始化所有元素都赋值intarr1[5]{10,20,30,40,50};// 2. 部分初始化只赋值前几个剩余元素自动为0intarr2[5]{10,20};// 等价{10,20,0,0,0}// 3. 省略长度初始化编译器自动计算长度intarr3[]{1,2,3,4};// 数组长度自动为4return0;}3.1.3 初始化的常见错误避坑数组长度不能用变量静态数组。赋值时大括号外不能加分号 。赋值数量不能超过数组长度 。部分初始化剩余元素默认为 0。3.2 数组元素的访问与遍历3.2.1 下标访问的原理数组名代表数组首元素的地址通过数组名[下标]访问元素intarr[5]{10,20,30,40,50};arr[0];// 第一个元素10arr[4];// 最后一个元素503.2.2 数组的2种遍历方式for/while循环遍历把数组所有元素挨个打印 / 处理代码形式#includestdio.hintmain(){intarr[5]{1,2,3,4,5};inti;// 方式1for循环最常用printf(for循环遍历);for(i0;i5;i){printf(%d ,arr[i]);}// 方式2while循环printf(\nwhile循环遍历);i0;while(i5){printf(%d ,arr[i]);i;}return0;}3.2.3 【重点】数组越界问题后果避免方法定义访问的下标小于0或大于等于数组长度例intarr[5];arr[10];// ❌ 越界数组只有0~4下标后果程序崩溃数据错乱…避免方法遍历数组时循环条件写i 数组长度3.3 数组的入门级基础操作3.3.1 数组元素的查找按值/按下标主要是按值 / 按下标// 查找数组中是否存在某个数字intarr[5]{10,20,30,40,50};inttarget30;for(inti0;i5;i){if(arr[i]target){printf(找到元素下标为%d,i);break;}}3.3.2 数组的求和、求最大值/最小值intarr[5]{1,2,3,4,5};intsum0;intmaxarr[0];// 求和找最大值for(inti0;i5;i){sumarr[i];if(arr[i]max)maxarr[i];}printf(总和%d最大值%d,sum,max);3.3.3 数组的逆序反转操作intarr[5]{1,2,3,4,5};// 逆序核心交换首尾元素for(inti0;i5/2;i){inttemparr[i];arr[i]arr[4-i];arr[4-i]temp;}// 结果5 4 3 2 1四、数组经典入门算法初阶必掌握4.1 冒泡排序数组最经典入门排序原理相邻元素两个两个比较之后大的元素往后从小到大排序性质具有稳定性// 冒泡排序升序排列intarr[5]{3,1,4,2,5};intn5;for(inti0;in-1;i){//外层循环 循环的次数for(intj0;jn-i-1;j){//内层循环 比较数据if(arr[j]arr[j1]){// 交换元素inttemparr[j];arr[j]arr[j1];arr[j1]temp;}}}4.2 选择排序对比冒泡入门级排序原理第一个数字和后面的所有数字进行比较若有比第一个数字还小的数则交换位置以此类推…性质不具有稳定性intarr[5]{3,1,4,2,5};intn5;for(inti0;in;i){intminIndexi;for(intji1;jn;j){//j从i1跑到数组最后一个if(arr[j]arr[minIndex])minIndexj;}// 交换inttemparr[i];arr[i]arr[minIndex];arr[minIndex]temp;}4.3 数组去重有序数组有序数组去重// 有序数组1,2,2,3,3,3intarr[6]{1,2,2,3,3,3};intres[6];intj0;res[0]arr[0];for(inti1;i6;i){if(arr[i]!res[j]){j;res[j]arr[i];}}五、新手必踩的数组坑避坑指南5.1 数组下标越界最常见•表现程序闪退、输出乱码•解决遍历数组时循环条件i 长度永远不要访问arr[长度]5.2 数组初始化的隐藏规则• 部分初始化后未赋值元素为0•例int arr[5] {1}; → 数组为 {1,0,0,0,0}5.3 【C语言重点】数组传参的陷阱• 数组传给函数时传递的是首地址不是整个数组• 函数内无法获取数组原长度必须手动传入长度5.4 数组名的本质常量指针不能被赋值• 数组名是常量指针不能被赋值• ❌ 错误arr {1,2,3};六、数组初阶实战小案例新手友好6.1 学生成绩管理系统#includestdio.hintmain(){intscores[5];intsum0;// 录入成绩for(inti0;i5;i){printf(请输入第%d个成绩,i1);scanf(%d,scores[i]);sumscores[i];}printf(平均分%.2f,sum/5.0);return0;}6.2 用数组实现斐波那契数列// 斐波那契1 1 2 3 5 8...intfib[10];fib[0]1;fib[1]1;for(inti2;i10;i){fib[i]fib[i-1]fib[i-2];}6.3 数组实现扫雷/五子棋棋盘// 3*3 棋盘扫雷/五子棋基础charboard[3][3]{{*,*,*},{*,*,*},{*,*,*}};七、总结与进阶方向7.1 数组初阶核心知识点梳理1.数组是连续存储、类型统一、下标 0 开始、长度固定的集合2. 掌握定义、初始化、遍历、越界、基础操作3. 必会算法冒泡排序、选择排序7.2 接下来可以学什么学完本篇你可以进阶学习二维数组表格、棋盘、矩阵动态数组malloc/free长度可修改字符数组与字符串更高级的排序算法数据结构链表、vector知识点讲完啦学完数组别忘抬头看春天呀送上学校的海棠花祝大家代码顺利春日愉快

更多文章