GESP三级C++选择题第9-15题核心考点解析与避坑指南

📅 发布时间:2026/10/12 15:48:16
GESP三级C++选择题第9-15题核心考点解析与避坑指南
GESP三级的选择题尤其是中间那一段看起来简单实际上很能拉开分差。这篇文章就围绕2026年3月认证C三级第一部分的选择题第9到15题展开把这部分题目的命题思路、对应考点和解题技巧整理清楚备考的同学可以直接照着准备。1. 考试结构里的“中间地带”第9到15题到底考什么1.1 选择题在整场考试中的定位GESP三级认证的卷面结构很固定第一部分是选择题第二部分是编程题。选择题一般占40分左右别看它是客观题就以为可以靠“蒙”混过去实际上这部分得分直接决定了你后面做编程题的心态。拿到一套三级试卷选择题的分值分布大体是前几题送分中间部分开始上强度最后几题对综合能力有要求。我这些年带学生参加三级考试总结出一个规律选择题的前8题基本是“一眼题”考的是变量类型、运算符优先级、简单程序阅读这些最基础的内容只要平时练习到位基本不会失分。第9到15题则进入了一个微妙的区间——题目不再直接考“是什么”而是开始考“会怎样”给一段程序问你输出什么给一个数组操作问边界情况下的结果给一个递归函数问调用了几次。这些题目如果没做过足够的训练很容易在考场上卡住一卡就是好几分钟后面编程题的时间就紧了。1.2 为什么第9到15题最值得单独拆解很多同学备考时有个误区只刷编程题觉得选择题简单。等到真上了考场才发现选择题丢分比编程题还狠。原因很简单编程题你可以通过编译器和调试器帮你找错选择题没有任何“反馈机制”错了就是错了全凭你对知识的掌握是不是足够精确。第9到15题尤其特殊原因有三点第一它承接基础题和难题是试卷难度曲线的转折点好几道题就从一个考点里挖了陷阱等你跳第二这部分题目的考点高度集中在数组、字符串、函数、结构体、指针这些三级核心知识上掌握好这一段的题目基本等于掌握了大半个考纲第三这部分题目的命题风格相对固定可以通过专项训练显著提分性价比非常高。1.3 分数权重与备考优先级判断按照常见的分值设置选择题每道2分第9到15题加起来就是14分。14分是什么概念编程题一共三道你随便一道题因为一个小错误没通过全部测试点丢的分就差不多是这14分。所以把这14分稳稳拿到手等于给自己买了一份“保险”。我给备考生的建议是在保证前8题不丢分的前提下把第9到15题当作选择题部分的拿分核心来练。这个区间的题目练熟了后面那些更复杂的综合题也会有明显提升因为它们的底层考点是一样的。2. 第9-15题核心考点深度拆解虽然是同一张试卷里的连续题目但第9到15题内部也有明确的分工。我根据这几年的真题规律和考纲要求把这7道题涉及的主要考点拆成了四块每一块都可以单独攻克。2.1 数组与下标边界中档选择题的“常驻嘉宾”数组是三级考试绝对的重点选择题里几乎年年出现。第9到10题很喜欢围绕数组做文章尤其是一维数组和二维数组的下标访问。一维数组的核心就是下标从0开始长度为n的数组有效下标是0到n-1。这个规则绝大多数同学都背得住但题目不会直接问你“下标从哪里开始”它会绕个弯定义一个数组a[5]然后让你判断a[5]这个访问是否合法。很多同学一看到a[5]就觉得没问题实际上这已经越界了访问的是一个不存在的元素。二维数组更麻烦它考的是存储顺序和地址计算。你定义一个a[3][4]它在内存里是按行存储的a[i][j]的地址计算方式是首地址 i×4×每个元素字节数 j×每个元素字节数。题目可能给你一个具体的地址问你a[2][1]的地址是多少或者反过来给了地址让你反推是第几个元素。我建议备考时重点做这几类数组题目数组初始化时未显式赋值的元素默认是什么值数组名作为函数参数时在函数内部用sizeof得到的结果是多少二维数组按行和按列遍历时哪一种效率更高为什么数组越界访问可能带来什么样的程序行为int a[3][4]; // a[1][2] 是第几个元素 // 行优先存储先数完第0行的4个再数第1行的4个 // 所以 a[1][2] 是第 1*4 2 1 7 个元素从1开始数这类题不难但需要你在考场上的反应速度足够快。平时练习时不要看一眼答案就过要自己动手在纸上把内存布局画一遍画多了自然就熟练了。2.2 字符串与字符数组陷阱最多的考点字符串在三级选择题里出现频率极高第10到11题特别喜欢结合字符串做文章。这里有个关键区分C风格字符串字符数组和标准库string。三级考试对这两者都会涉及但字符数组的细节更多陷阱也更隐蔽。谈到C风格字符串第一反应就应该是那个看不见的结尾符。比如char s[6] hello;很多同学数一下hello是5个字符所以数组大小5就够了写成char s[5]。但实际上字符串字面量“hello”在内存中占据6个字节最后一个字节存放的是字符串结束标志。如果你定义成s[5]强行把“hello”放进去最后那个位置就会被覆盖程序行为就说不清了。字符串比较也常常出现在选择题里。两个字符数组不能直接用比较内容比较的是数组首地址只有用strcmp或者string的运算符才是比较内容。这个点我在考前的模拟题里反复强调每次都能看到有同学在这里栽跟头。再看一个容易错的点字符串长度和数组大小的关系strlen(s) 返回字符串长度不包含结束符sizeof(s) 返回数组占用的字节数包含结束符出一道典型题定义一个数组char s[] GESP;请问strlen(s)和sizeof(s)分别是多少答案是strlen(s)为4sizeof(s)为5字符串实际占5个字节因为还有一个结束符。这个考点几乎每年都有但答错率一直很高。2.3 函数传参与递归理解树形思维的关键这一块是第12到14题的高频考点同时也是很多同学学编程时的分水岭。函数部分最重要的区分是值传递和引用传递。void change1(int x) { x 10; } void change2(int x) { x 10; } int main() { int a 5; change1(a); // a 还是 5形参x是实参a的副本改的是副本 change2(a); // a 变成 10形参x是实参a的别名 return 0; }选择题喜欢考的就是这个改动之后实参到底有没有变。无论题目怎么换皮核心逻辑就是看函数参数列表里有没有那个“取地址符”有就是引用传递没有就是值传递。递归更是选择题的常客。考递归的题不会让你写一个递归函数而是给你一个递归函数让你计算调用结果。比如经典的阶乘、斐波那契数列、汉诺塔移动次数你需要能像计算机一样一步一步地展开递归调用。很多同学学递归时有个毛病不去画调用栈只在脑子里“感觉”。一旦递归深度超过两三层感觉就靠不住了。我辅导学生时要求他们必须掌握“递归展开”的书面记录方法int f(int n) { if (n 1) return 1; return f(n - 1) f(n - 2); } // 计算 f(5) 时 // f(5) f(4) f(3) // f(4) f(3) f(2) // f(3) f(2) f(1) // f(2) f(1) f(0) // 展开成树形结构逐层计算f(0)1, f(1)1, f(2)2, f(3)3, f(4)5, f(5)8。如果你在考场上遇到递归题不要凭记忆背结果要养成“展开一层就不会错”的习惯。2.4 结构体与基础指针从“值”到“地址”的跨越第14到15题经常会把结构体和指针放到一起考因为这两个概念是C从基础语法迈向数据结构的跳板。结构体本身并不难定义、声明变量、用点运算符访问成员这些属于基础操作。但对结构体指针的访问方式很多同学要绕一阵子。核心就是两句话结构体变量用点.访问成员结构体指针用箭头-访问成员struct Student { string name; int score; }; Student stu; Student *p stu; // 等价写法 stu.score 90; (*p).score 90; // 先用 * 解引用再用点访问 p-score 90; // 箭头访问等价写法选择题可以这样考给你整型和指针相关的代码问输出结果。比如int a 10; int *p a; *p 20; cout a; // 输出多少答案是20。p保存的是a的地址通过*p修改的是p指向的地址里的值也就是a本身。值传递和指针传递在数组上也有体现数组名在表达式中会退化为指向首元素的指针所以数组传参本质上传递的是首元素的地址在函数里修改数组的元素实参会跟着变。我还想提醒一点结构体在三级选择题里的另一种考法是“结构体数组”。一个学生数组按某个字段排序问你排序后某个位置的学生是谁。这种题其实在考“结构体数组能否交换”以及“结构体变量之间能否直接赋值”。实际上相同类型的结构体变量可以整体赋值。3. 实操典型例题与解题策略讲完考点接下来进入实战环节。我特意选取了和第9-15题风格接近的几种典型题型一步步分析解题过程。建议你看到题目后先自己做一遍再对照我的思路这样才有效果。3.1 数组题实战一题带你看懂下标逻辑先看一道典型的数组选择题风格参考三级真题已知 int a[5] {1, 2, 3, 4, 5}; int *p a; 请问 *(p2) 的值是多少很多同学一看p是a的首地址p2不是第三行的意思吗这里要理清指针加法和普通加法完全不同。p2在指针语境下指向的是“向后移动2个int类型的元素宽度后的地址”而int类型在常见环境下占4个字节所以p2指向的是a[2]的地址*(p2)就是a[2]的值也就是3。如果这个题目把int换成char结果就完全不一样了。char占1个字节指针加2就只跳过2个字节指向的是从首元素向后数第2个字节的位置。这里必须时刻记住一个原则指针加n指向的是n个基类型元素之后的那个元素移动的实际字节数是n乘以该类型的大小。再延伸一道二维数组的题目风格已知 int a[2][3] {{1,2,3},{4,5,6}}; 请问 a[1][0] 对应的线性存储位置上是第几个元素按行优先存储a[0][0]是首个元素a[1][0]前面有第一行的3个元素所以它是第4个元素从1开始数。题目如果给你“起始地址为1000int占4字节”问a[1][2]的地址那计算方法就是1000 (1×3 2)×4 1020。这类题的做题顺序我建议采用“三步走”确定数组类型和每个元素占用字节数确定目标元素前面还有几个完整行和几个同行的元素计算偏移量加上首地址得到答案3.2 字符串处理实战留意每个字符的位置来看字符串的典型选择题定义 char str[] GESP; 下列哪个表达式的值不为整数4A. strlen(str)B. sizeof(str) - 1C. sizeof(str)D. 从str[0]到str[3]的字符个数正确答案是C。sizeof(str)返回的是整个数组占用的字节数字符串“GESP”加上结尾的结束符一共是5个字节。A选项strlen计算的是可见字符数目正好是4B选项5减1也是4D选项数str[0]到str[3]四个字符也是4。这道题其实就是我在2.2里强调过的“strlen和sizeof的区别”。考场上一旦遇到字符串数组大小和长度的题目先把结束符写出来再数一遍不要凭猜测答题。字符串题目还有一种考法字符数组的遍历。比如char s[] abc; for (int i 0; s[i] ! \0; i) { cout s[i]; }循环条件是s[i] ! \0也就是当s[i]不是字符串结束符时执行循环体。这个写法比用strlen求长度再循环更安全因为一旦结束符被意外修改行为会比较隐蔽。选择题里让你判断循环体执行几次答案就是字符串的长度而不是数组的大小。3.3 函数与递归实战画栈是基本功函数这一块最典型的题目就是“运行以下程序输出多少”。比如void swap1(int a, int b) { int t a; a b; b t; } void swap2(int *a, int *b) { int t *a; *a *b; *b t; } int main() { int x 3, y 5; swap1(x, y); cout x y endl; // 3 5交换失败 swap2(x, y); cout x y endl; // 5 3交换成功 return 0; }这段代码几乎是三级“函数参数传递”的母题。理解了它就理解了值传递、指针传递的本质区别。value传递是拷贝一份数据给函数函数内部怎么改都不影响外面的变量指针传递是把变量的地址交给函数函数通过地址去修改那个位置的内容外面的变量当然就变了。再来看递归的经典题目int fun(int n) { if (n 0) return 0; if (n 1) return 1; return fun(n - 1) fun(n - 2); }问fun(6)的值。这其实是斐波那契数列的一种变体f(0)0f(1)1f(2)1f(3)2f(4)3f(5)5f(6)8。关键是你要能够递归地展开计算而不是“好像在哪见过”。我建议平时练习递归题时用“栈帧法”来手推fun(6) fun(5) fun(4) (fun(4) fun(3)) (fun(3) fun(2)) ...每展开一层就把结果记下来最后自底向上逐层返回。考场上没有编译器你的草稿纸就是最好的调试工具。3.4 结构体与指针实战几个必须厘清的等价关系结构体指针的选择题常见的有这样一道风格以下哪个表达式不能等价访问结构体变量stu中的成员变量score设 Student *p stu;A. stu.scoreB. (*p).scoreC. p-scoreD. p.scoreD是错的p是指针不是普通对象不能用点运算符直接访问成员。这种题目就考一个事情——你对结构体指针访问方式的熟练程度。熟练的同学一眼就能看出来但没掌握的同学会犹豫很久。还有一种结合sizeof的考法struct Node { int x; char c; double d; };问 sizeof(Node) 是多少这道题实际是在考内存对齐。int占4字节char占1字节double占8字节但这不意味着结构体大小就是41813字节。按常见的64位环境对齐规则是结构体大小必须是对齐系数的整数倍通常Node的大小是16字节或者24字节与编译器相关。三级考试可能会考到这个点你需要知道存在内存对齐这个机制结构体大小不等于成员大小简单相加。这个问题没法用一个固定值背出来因为不同平台的align规则不同。如果题目没有特殊说明一般默认就是“成员字节数相加可能会被对齐调整”你能根据最简单的情况默认4字节对齐推算出常见组合的大小即可。4. 常见错误与避坑指南平时练习和模拟考中我发现考生在第9到15题上失分的原因非常集中。这些坑几乎每届学生都会踩一遍我把它们列出来你对照自查能省下不少冤枉时间。4.1 高频易错点清单考点错误表现正确认知数组下标以为a[n]可以访问第n个元素并改变它下标0到n-1a[n]越界字符数组忽略了结束符占一个字节“abc”占用4个字节strlen与sizeof认为两者结果一样strlen不含结束符sizeof含值传递以为函数里改了形参外面也会变形参是副本不影响实参指针自加以为p1是地址加1p1跳过的是整个基类型大小的字节数结构体指针用点访问指针所指的成员指针要用箭头对象才用点内存对齐直接累加成员大小结构体大小可能大于成员和这张表是浓缩版的“避坑手册”。我建议你把这张表抄在笔记本上每次做错题就回来对照一遍看自己掉进的是哪一个坑。做错的次数多了这个坑就再也坑不到你了。4.2 考场解题的“三步法”选择题虽然时间紧但不代表可以乱蒙。我摸索出了一套适合第9到15题的中档题解题流程经过不少学生实践稳定性和效率都不错第一步圈出题目里的关键限定词。看到“数组”“指针”“引用”“sizeof”“strlen”这些词直接在题目上画圈。很多同学做错题不是不会而是没看清题目问的是“值是多少”还是“地址是多少”“能编译”还是“不能编译”“正确”还是“不正确”。圈出关键词能在很大程度上避免这种低级失误。第二步在草稿纸上写一遍关键变量的变化过程。选择题不需要写出完整代码但变量的变化过程一定要写出来。比如遇到递归就把调用树画出来遇到数组地址计算就把内存布局画出来。草稿纸上的记录越清楚你的思维就越不会乱。第三步用“反推法”确认答案。如果计算结果是依赖于某个特定条件比如不同编译器字节数不同就再回去看题目有没有说明环境。如果你的答案和某个选项不符不要急着改重新读一遍题目看是不是漏了强制类型转化、运算符优先级这些细节。4.3 备考中最容易被忽视的两件事第一件容易被忽视的事是不重视“存储与地址”这一底层基础。三级的选择题很多看似是“程序阅读”本质上考的是“变量到底存在哪里、占多大空间、地址移动一步到底是多少字节”。有些同学能把代码背得滚瓜烂熟但一涉及到地址计算就发懵这就是底层基础不牢的典型表现。考前一定要把数据类型的大小、数组的存储布局、指针运算的字节语义彻底搞懂。第二件容易被忽视的事是练习时只看选项不看完整输出。有的同学用刷题软件练选择题点开一个选项结果显示“正确”就跳过去了完全不管题目的完整分析过程。这种方法练一个月该错的地方还是错。我要求我辅导的学生每做一道典型选择题都要在纸上把完整推理过程写一遍题目本身只有2分但养成完整分析的习惯在后面的编程题里能帮你拿到更多分。5. 高效备考策略与时间规划最后这部分讲讲怎么在剩下的时间里高效准备第9到15题以及整个三级考试。5.1 考纲对照自查表在开始冲刺之前先把基础盘点点清楚。我整理了一份三级核心考点自查表每一项你都要能回答“是什么”并且能举出例子模块核心知识点列表我的掌握程度0-5基础语法变量定义、类型转换、运算符优先级数组一维/二维数组定义、下标访问、数组传参字符串字符数组、结束符、常用字符串处理函数函数参数传递值/引用/指针、默认参数递归递归函数分析与计算、结束条件结构体结构体定义、成员访问、结构体数组/指针指针指针声明、指针运算、指针与数组的关系位运算与、或、非、异或、移位运算对照这张表给自己打分。低于3分的项目需要直接安排专项练习3到4分之间的项目用真题巩固5分的项目每周简单复习一下即可。第9到15题涉及的考点几乎都在“数组”到“指针”这几行里你对号入座就能找到自己最需要补的部分。5.2 40天冲刺计划参考根据我的经验一个有45到50天的备考周期就能相对从容地拿下三级。这里我给出一个40天的参考计划你可以根据自己的情况灵活调整第一阶段第1到第15天基础巩固与漏洞排查这一阶段的核心任务是把考纲里的每一个知识点过一遍尤其是上面自查表里低于3分的项目。每一类考点配套做10到15道基础题重点是把概念弄准确比如数组的下标范围、字符串结束符的作用、值传递和引用传递的区别、指针加减的字节语义。这个阶段不建议大量刷整套试卷因为基础不牢的时候刷整卷效率太低。第二阶段第16到第30天专项突破与易错点强化这一阶段开始集中攻克第9到15题的类型。你可以找近两年的三级真题和模拟题每套只做选择题尤其是9到15题连续做做完之后对照我在第4节列出的易错点清单把错的题目归类记录。每个分类积累到一定数量后把同类的错题放在一起重新做一遍看看是不是系统性地错在同一类考点上。比如你连续三次都在“指针运算跳过多少字节”上出错那就要专门拿出一个下午把char、int、double、结构体指针的移动字节数全部整理一遍。第三阶段第31到第40天全真模拟与节奏训练最后十天就是以整套试题为单位做模拟了。做题时给自己卡时间选择题部分尽量控制在25分钟内完成留出充足时间给编程题。每次模拟考完不要只看分数要复盘每道题的用时第9到15题如果单题用时超过3分钟说明对知识点还不够熟练需要回到第二阶段重新做定点突破。模拟的目的是找到自己的节奏而不是追求做题的数量。5.3 “一题三用”的练习方法最后分享一个我自己非常推崇的练习方法一题三用。具体来说拿到一道选择题不要只满足于做对要做三件事第一遍按照正常思路做记录步骤和结果。第二遍改条件重做。题目给的是int数组你就改成char数组试试题目是值传递就改成引用传递试试。一题变三题每次改动都让你对知识的理解更深一层。第三遍把选择题改编成编程题或口述题。比如题目考的是“a[1][2]的地址是多少”你可以在编译器里写一段完整的程序用程序输出这个地址来验证自己的计算结果。这一步把选择题的“纸上谈兵”变成真正的代码验证理解会更扎实。这套方法最大的好处是你用较少的题目就能覆盖较多的知识点变化避免陷入“刷题很多、能力没涨”的假象。回到第9到15题我的个人体会是它不像压轴题那样需要灵感和天赋更像一个“熟练度”的考场。把数组、字符串、函数、结构体、指针这几块内容吃透把容易踩的坑提前踩一遍这部分拿到满分并不是遥不可及的事。备考时如果时间紧张优先把精力放在这套考点组合上收益是最直观的。在考场上如果遇到一道第9到15题区间的题目拿不准就先在草稿纸上把变量变化过程写出来不要盯着屏幕空想多写一步思路往往就通了。最后再分享一个小技巧考前一周把那些你以前做错的题目重新打印出来不看答案只给自己20分钟快速复述每道题的考点和易错点。能说清楚考场上就基本不会翻车。祝备考顺利。