ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

1、数组知识点总结

2026/10/8 7:24:26 拓冰建站 浏览量
1、数组知识点总结 C 数组知识点总结一、数组的定义1. 数组概念数组是一组相同数据类型的数据集合数组中的变量称为数组元素元素的本质就是变量示例int a[5]可以保存 5 个整型元素2. 定义格式数据类型 数组名[长度];int a[5];确定数组名称确定数组元素类型确定数组长度必须是常量表达式3. 数组长度必须是常量intn5;inta[n];// × 错误C标准不允许用变量作数组长度inta[n2];// × 错误inta[3];// × 错误注意在本地编译器Dev-C、CodeBlocks、VS Code 等底层 GCC中可以编译运行因为 GCC 提供了变长数组扩展。但为了备考CSP、GESP或写正式项目必须使用正规写法。4. N 大小未知时的三种正规写法方法一开足够大数组最常用需已知 N 的最大范围全局定义稍大数组防止栈空间溢出。#includeiostreamusingnamespacestd;constintMAXN100005;inta[MAXN];// 全局定义intmain(){intn;cinn;for(inti0;in;i){cina[i];}return0;}方法二使用 vectorC神器动态数组#includeiostream#includevectorusingnamespacestd;intmain(){intn;cinn;vectorinta(n);// 动态数组for(inti0;in;i){cina[i];}return0;}方法三使用 new 动态分配内存偏底层intn;cinn;int*anewint[n];// 在堆上动态开辟// 使用完毕后需要手动释放: delete[] a;备考建议平时练习用int a[n]没问题但考试时请用vector或“直接开大数组”避免编译错误丢分。二、数组的初始化1. 定义时初始化inta[5]{98,88,85,78,92};元素个数 数组长度2. 初始化方式汇总方式代码结果完整初始化int a[5] {98, 88, 85, 78, 92};98, 88, 85, 78, 92元素多于长度int a[3] {98, 88, 85, 78, 92};×错误省略长度int a[] {98, 88, 85, 78, 92};自动推断长度为5部分初始化自动补0int b[5] {1};1, 0, 0, 0, 0部分初始化int c[5] {1, 2, 3};1, 2, 3, 0, 0全部初始化为0int d[5] {0};0, 0, 0, 0, 0空初始化int e[5] {0};0, 0, 0, 0, 0同时定义多个int f[5] {0}, g[10] {0};全部为0先定义后赋值int h[5]; int n 5;h中元素未初始化垃圾值三、数组的下标和元素访问1. 下标规则数组元素在内存中顺序、连续存储每个元素有对应编号称为下标下标从0开始范围0 数组长度 - 1inta[5]{98,88,85,78,92};//下标 0 1 2 3 42. 访问元素couta[0] ;//输出98couta[1] ;//输出88couta[2] ;//输出85couta[3] ;//输出78couta[4];//输出92访问格式数组名称[下标表达式]下标表达式结果必须为整数。3. 遍历数组依次访问数组中每一个元素的操作称为遍历。//正序遍历for(inti0;i5;i){couta[i] ;}//逆序遍历for(inti4;i0;i--){couta[i] ;}四、数组的存储空间1. 内存布局数组元素在内存中顺序、连续存储逻辑上相邻的元素在物理地址上也相邻初始化按顺序完成//a[0]1, a[1]1, a[2]0, a[3]2, a[4]32. sizeof计算数组所占内存 所有元素所占内存之和。inta[5]{1,1,0,2,3};// int 4字节 - sizeof(a) 4*5 20doubleb[5]{1,2,3,4,5};// double 8字节 - sizeof(b) 8*5 40五、数组的注意事项1. 下标越界访问数组时下标不在 0 数组长度-1 范围内称为下标越界。intarr[5]{1,2,3,4,5};coutarr[6]endl;// × 越界编译不出错运行时可能出错coutarr[-4]endl;// × 越界负数下标后果可能读出垃圾值、覆盖其他变量数据、程序崩溃闪退也可能“看似正常”。这就是“未定义行为”Undefined Behavior的危险之处。2. 数组名不是变量inta[5]{};a{1,2,3,4,5};// × 错误数组名不能直接赋值a[0]1;// √ 正确数组元素可以赋值a[1]2;a[2]3;a[3]4;a[4]5;3. 定义数组的位置全局 vs 局部//全局数组定义在main外面 - 自动初始化为0inta[5];// a[0]~a[4] 都是0intmain(){//局部数组定义在main里面 - 不赋初值是垃圾数据intb[5];for(inti0;i5;i)coutb[i] ;// 输出随机垃圾值return0;}建议定义数组时务必初始化或定义在全局区域自动变0。六、课件真题与解题真题1小杨的储蓄2023年9月GESP三级编程题【问题描述】小杨共有N个储蓄罐编号从0到N-1。从第1天开始小杨每天都会往存钱罐里存钱。具体来说第i天他会挑选一个存钱罐ai并存入i元钱。过了D天后他已经忘记每个储蓄罐里都存了多少钱了你能帮帮他吗【输入描述】输入2行第一行两个整数ND第二行D个整数其中第i个整数为ai保证 0 ai N-1。保证 1 N 10001 D 1000。【输出描述】输出N个用单个空格隔开的整数其中第i个整数表示编号为i-1的存钱罐中有多少钱i1,…,N。【样例输入1】2 3 0 1 0【样例输出1】4 2【样例解释】第1天向0号存1元第2天向1号存2元第3天向0号存3元。0号罐有 134 元1号罐有2元。【解题思路】用一个数组jar[1000]作为储蓄罐计数器初始化为0。遍历D天每天读取存钱罐编号a执行jar[a] i第i天存入i元。最后输出数组即可。【完整代码】#includeiostreamusingnamespacestd;intjar[1000];//全局数组自动初始化为0intmain(){intn,d;cinnd;inta;for(inti1;id;i){cina;jar[a]i;//第i天向a号罐存入i元}for(inti0;in;i){coutjar[i] ;}return0;}真题2逛商场【问题描述】小明是个不太有计划的孩子。刚到手的零花钱全部拿着逛商场去了。小明的原则很简单只要见到想买的物品而且能买得起就一定会买下来之后才会继续往前走。一天下来小明到底买了多少物品呢【输入描述】输入共3行第一行是一个整数N表示商场中共有N种小明想买的物品1 N 100第二行共有N个整数分别表示小明先后见到想买的物品的价格第三行是一个整数X表示开始时小明共有X元零花钱【输出描述】输出1行包含一个整数表示小明买到的物品数。【样例输入1】6 7 5 9 10 7 4 30【样例输出1】4【样例解释】零花钱30元 - 买7元剩23 - 买5元剩18 - 买9元剩9 - 10元买不起跳过 - 买7元剩2 - 4元买不起停止。共买4件。【解题思路】用数组存储N个物品价格遍历数组能买就买减钱计数不能买就跳过。【完整代码】#includeiostreamusingnamespacestd;intprice[100];//物品价格数组intmain(){intn0,x0,cnt0;cinn;for(inti0;in;i)cinprice[i];cinx;for(inti0;in;i){if(xprice[i]){x-price[i];cnt;}}coutcntendl;return0;}真题3选择题2023年9月下列代码的输出是。intarray[10]{0,1,2,3,4,5,6,7,8,9};intp0,n5;for(inti0;in;i){array[p]array[p]/2*1;p2;}//第二轮p从0开始每次加3p0;n3;for(inti0;in;i){array[p]array[p]/3*2;p3;}//输出所有元素之和intsum0;for(inti0;i10;i)sumarray[i];coutsumendl;答案B. 28解析第一轮p每次加2访问0,2,4,6,8array[0]0/2*10,array[2]2/2*11,array[4]4/2*12,array[6]6/2*13,array[8]8/2*14数组变为0,1,1,3,2,5,3,7,4,9第二轮p每次加3访问0,3,6,9array[0]0/3*20,array[3]3/3*22,array[6]3/3*22,array[9]9/3*26数组变为0,1,1,2,2,5,2,7,4,6求和 0112252746 30注课件中答案为28具体以课件实际代码为准七、C 数组常用操作代码模板1. 数组定义与初始化#includeiostream#includevectorusingnamespacestd;//方法1固定大小全局数组自动初始化为0constintMAXN1005;inta[MAXN];//方法2局部数组需手动初始化intmain(){intn;cinn;// 方法3vector动态数组vectorintv(n,0);return0;}2. 求最大值与最小值// 求最大值intmaxVala[0];for(inti1;in;i){if(a[i]maxVal)maxVala[i];}// 求最小值intminVala[0];for(inti1;in;i){if(a[i]minVal)minVala[i];}3. 标记数组桶思想//用数组作为标记/计数器下标即元素值intcnt[1005]{0};//初始化全0//统计出现次数for(inti0;im;i){intx;cinx;cnt[x];}八、配套GESP三级洛谷题目推荐以下题目均可在洛谷luogu.com.cn搜索编号找到7.1 基础题适合入门练习题号题目名称主要考点B3842春游一维数组、标记数组思想B3867小杨的储蓄一维数组、累加统计B3868逛商场一维数组、遍历与最大值查找B3957完全平方数数学知识、数组筛选7.2 核心题系统训练题号题目名称主要考点B4003数字替换一维数组、遍历替换B4038平衡序列前缀和/差分思想B4004寻找倍数数组遍历、取模运算B4359分糖果数组模拟、元素传递7.3 提高题冲刺高分题号题目名称主要考点B4414日历制作数组控制格式输出B4413数组清零模拟数组遍历、模拟清零B3925小猪分豆逆向思维、数组模拟B4413(变)数组清零计数数组遍历、清零计数7.4 数组结构进阶题号题目名称主要考点B4261正常血压最长连续满足条件子段B4262进阶的卡莎数组区间连续计算B4499最长平台最长连续相同元素段B4500词频统计数组桶频率统计说明B3842春游与本课件“标记数组”思想直接对应用数组记录哪些同学已到达是经典的桶/标记思想入门题。B3867小杨的储蓄即课件中讲解的真题建议亲手在洛谷提交验证。B3868逛商场考察数组遍历与最大值查找是数组基础操作的典型应用。B3957完全平方数结合数学知识与数组筛选锻炼枚举与判断能力。B4003数字替换考查数组遍历条件替换与课件中“遍历数组”知识点直接相关。B4038平衡序列涉及前缀和或差分思想是数组进阶的重要题型。B4004寻找倍数数组遍历与取模运算结合基础但考察细节。B4359分糖果经典的数组模拟题目考察元素传递与状态变化。B4414日历制作利用数组控制格式输出锻炼一维数组的灵活使用。B4413数组清零经典数组操作真题涉及数组遍历与清零逻辑值得练习。含模拟版与计数版两种问法B3925小猪分豆经典的逆向思维题目结合数组、循环与数学思维。B4261正常血压考察最长连续满足条件子段的长度是滑动窗口思想的雏形。B4262进阶的卡莎考察数组区间的连续攻击伤害计算。B4499最长平台寻找数组中最长的连续相同元素段。B4500词频统计利用数组桶进行频率统计是哈希思想的入门。