GESP 三级 · GESP 202406 C++ 三级 第 20 题

判断题 · 答案 B

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

题目

数组的所有元素在内存中可以不连续存放。

答案:B

解题思维

答案B。定义数组时[]内必须是常量表达式(可用char常量作为下标,因为char本质是整数)。int c[3.0]不合法。

常见错误

C++不允许对数组直接赋值(如int a[3]=b不合法),但可以逐个赋值元素。

详细解析(节选)

【考点】数组内存布局|指针运算|内存连续性

🎯 考纲定位 GESP C++三级大纲明确要求掌握数组存储原理。命题人专门设置这道判断题,就是要卡住那些"背过数组定义但没打开编译器验证过"的考生——很多人凭经验觉得"数组不就是几个变量吗?存哪都行",却忘了数组在 C++ 中是严格通过连续内存块实现的,这是语言层面的硬性规定而非实现细节。

🧠 解题思维 看到"数组元素"四个字立刻反应:这是语言规范,不是数据结构设计。C++ 中数组名退化成指针,下标运算本质是"基地址 + 偏移",偏移量 = 下标 × 元素大小。如果元素不连续,这个公式就彻底失效了。关键观察点在于"所有元素"这个全称量词——只要有一个元素不跟紧前一个,整个数组就违反定义。推理链条很直接:数组定义→连续内存块→指针运算成立→任何非连续存放都会破坏语言规则。

🪤 陷阱拆解 选项 A 的"可以"二字极具迷惑性。命题人利用考生对"动态数组"或"链表"概念的迁移错误——数组和链表虽然都叫"数组",但内存布局完全不同。更阴险的细节是"不连续存放"这个表述,它偷换了概念:数组元素本身必须连续,但数组块在内存中的位置可以"不连续"吗?答案是:数组块本身就是一个连续范围,不存在"不连续存放"的说法。如果你只背"数组是连续的"这个结论,不理解"连续"指的是元素首尾相接,就会掉进这个语义陷阱。

🔄 反命题思维 命题人如果把"数组"换成"动态数组",答案就变成 A 了——因为 std::vector 确实允许内部扩容时元素迁移。如果把"所有元素"改成"部分元素",也变成 A——未初始化元素可以任意填充。刷到类似题时先问自己:这个判断题考的是语言定义还是实现细节?如果是定义,全称量词和绝对化表述通常指向错误选项。

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