GESP 四级 · GESP 202512 C++ 四级 第 8 题

选择题 · 答案 A

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

题目

运行如下代码会输出( )。

struct Point {
    int x, y;
};

struct Rectangle {
    Point topLeft;
    Point bottomRight;
};

int main() {
    Rectangle rect = {{10, 10}, {20, 20}};
    rect.topLeft.x = 5;
    Point* p = &rect.bottomRight;
    p->y = 5;
    cout << rect.topLeft.x + rect.bottomRight.y;
    return 0;
}
答案:A

解题思维

答案A。指针和数组的代码追踪:画出变量和指针的内存示意图,追踪每次赋值后值的变化。

常见错误

指针和数组追踪时画内存布局图可以大大简化理解。

详细解析(节选)

【考点】结构体定义与初始化|成员访问运算符|指针与结构体成员

🎯 考纲定位 C++考级(四级)第 3 模块「结构体与枚举」核心内容。命题人专盯「指针指向结构体成员」这一高频丢分点——80% 考生会误把 p 当成独立变量,而非 rect.bottomRight 的别名。

🧠 解题思维 1. 初始化阶段:rect 的两个 Point 成员按顺序填充 → topLeft={10,10},bottomRight={20,20} 2. 第一次赋值:rect.topLeft.x = 5 → topLeft 变为 {5,10} 3. 指针绑定:p = &rect.bottomRight → p 成为 rect.bottomRight 的别名 4. 第二次赋值:p->y = 5 → bottomRight 变为 {20,5} 5. 输出计算:rect.topLeft.x(5) + rect.bottomRight.y(5) = 10 全程变量追踪,无顺序陷阱。

🪤 陷阱拆解

最阴险的是 p->y,箭头运算符暗示「通过指针访问成员」,背结论的人容易忽略 p 指向的是 rect.bottomRight 而非独立变量。

🔄 反命题思维 若把 p->y 改成 p->x,输出变成 5+20=25;若把 p 初始化为 &rect.topLeft,则 p->y 修改的是 topLeft.y,输出变成 5+10=15。刷到类似题先问「指针到底绑定哪个成员」。

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