GESP 三级 · GESP 202306 C++ 三级 第 22 题

判断题 · 答案 A

← 整套速查表 GESP 三级 全部真题

题目

在 C++ 语言中,数组被定义时,它的大小就确定了。

答案:A

解题思维

这题考的是C++数组定义的底层规则。拿到题先抓关键词“数组”和“定义”,回忆语法中[]内必须填什么。核心就一句话:数组大小是类型的一部分,编译期就定死了,跟vector那种动态容器完全是两码事。

常见错误

最容易掉进两个坑:一是被vector、动态数组的概念带偏,以为所有“数组”都能随时扩容;二是把“定义”偷换成“使用”,觉得既然能给元素赋值,那大小肯定也能变。其实C++原生数组定义时的大小必须是常量表达式,一旦定义完成,内存布局就锁死了,runtime想改大小得重新malloc一块新内存再拷贝,那在C++语法里叫“动态数组”或“vector”,不叫“数组定义”。

详细解析(节选)

【考点】数组特性|编译期常量|内存布局

这道题考查的是C++语言中数组定义的底层规则,属于GESP三级“基础编程”模块里“数据类型与内存”的核心内容。命题人专门挖这个坑,卡住的是不少考生对“数组”二字的理解偏差——很多人脑子里的“数组”其实是vector等动态容器,或者混淆了“定义”与“使用”的界限,却没分清C++原生数组的静态存储本质。

解题时,看到“数组”和“定义”这两个词,立刻要锁定C++的语法规则。数组定义的标准形式是 类型标识符 [常量表达式]。这里的“常量表达式”是关键:它必须在编译期就能确定一个具体的整数值。这意味着,当你写下 int a[5]; 时,编译器在编译阶段就已经为a在内存中划好了连续5个int大小的空间,a的类型本质上就是“包含5个int的数组”。既然大小已经写进类型里了,那“定义时大小就确定”这句话自然就是铁定的事实。

为什么很多人会选错B呢?主要有三类误区。第一类是被vector等动态容器带偏,以为所有“数组”都能扩容。其实vector是对象,有成员函数resize,而原生数组只是类型,没有这种能力。第二类是死记“数组内存连续”却忘了连续≠可变,连续只是内存布局特征,跟能不能改大小没关系。第三类是把“定义”偷换为“使用”,以为运行时能改大小。题目故意用“定义时”这个绝对化表述,就是为了逼你回到语言底层规则——数组类型本身就是包含大小的,就像int占4字节一样不可协商。

再深入一点,C++不允许对数组整体赋值(如int a[3]=b不合法),但可以逐个赋值元素,这是因为数组名在大多数情况下退化为指针,而指针本身没有大小信息,无法直接复制整个数组。这也侧面印证了数组大小在定义时就必须固定,否则这种语法行为就没法解释了。

从历年考频来看,复合类型在GESP三级共考了22题,其中数组相关题目占比不小;一维数组更是高频考点,2023年考了27题,2024年48题,2025年55题,2026年59题,呈逐年上升趋势。这说明命题组越来越重视学生对基础数据结构的理解深度,不再满足于只会用,而是要真正懂底层机制。

基于这个趋势,未来这类题目可能会更灵活。比如不再直接问“定义时大小是否确定”,而是结合其他概念挖坑,例如:“给定一个数组定义,判断以下哪个操作合法”、“数组名在函数参数中的含义”、“sizeof数组名与sizeof数组指针的区别”等。命题人可能会把“定义”换成“声明”,或者加个“可变”二字来制造混淆,答案就会反了。所以,下次刷到类似题,先问自己:这个语言里,数组大小是类型的一部分还是对象的一个属性?如果是类型的一部分,那定义时就必须确定。

总结一下,这道题虽然简单,但背后涉及的是C++数组的核心特性:大小是编译期常量,内存连续,类型包含大小信息。掌握这一点,不仅能答对这道题,还能避免在更复杂的编程场景中踩坑。

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断