CSP-J 入门级 · CSP 2023 入门级第一轮 第 3 题

选择题 · 答案 A · 考点:结构体(struct)、复合类型

← 整套速查表 CSP-J 入门级 全部真题

题目

阅读下述代码,请问修改 data 的 value 成员以存储 $3.14$,正确的方式是

union Data{
    int num;
    float value;
    char symbol;
};
union Data data;
答案:A

考点

结构体(struct)复合类型

解题思维

这题考联合体成员访问,拿到题先想联合体变量是对象不是指针,所以必须用点号。变量名在左、成员名在右,直接给 data 赋值 value 即可。

常见错误

最容易把联合体当成结构体去背,或者看到 "->" 就下意识用箭头,其实箭头只属于指针。另一个坑是顺序搞反,把成员名当变量名写在左边,编译器会报找不到标识符。还有少数人会把 union 和 struct 的内存分配规则混在一起,以为能同时存多个值,其实 union 同一时刻只能存一个成员。

详细解析(节选)

考点与概念

这道单选题考查的是 联合体(union)的成员访问方式。在 C/C++ 中,union 是一种特殊的复合类型,它的所有成员共享同一块内存空间,大小等于最大成员的大小,同一时刻只能存储一个成员的值。

访问联合体成员时,必须使用点号运算符 .,因为联合体变量本身是一个对象,不是指针。这与结构体(struct)的访问方式完全一致,唯一的区别在于内存布局规则。

命题视角:为什么考这个?

命题人出题的意图很明确:

1. 区分对象与指针:联合体变量 data 是一个普通对象,而指针变量需要用 -> 访问成员。这是 C 语言基础语法中最容易混淆的点之一。 2. 考察语序:变量名.成员名 的顺序必须正确,不能颠倒。很多学生看到 -> 就习惯性地写成 成员->变量,结果语法全错。 3. 干扰项设计:选项 B 把成员名 value 当变量用,选项 C 和 D 滥用箭头运算符,这些都是典型的“形似神不似”陷阱,专门用来筛掉那些只背口诀没理解本质的同学。

思考心法:拿到题怎么想?

看到 union Data data; 这行定义,脑子里立刻要弹出三个问题:

1. data 是什么? 它是一个联合体类型的变量,直接量,不是指针。 2. 要访问哪个成员? 题目说要存 3.14,对应的是 float value 成员。 3. 用什么符号? 既然是对象,必须用 .;如果是指针,才用 ->。

顺着这个思路,代码应该是:

union Data data;          // 定义变量
// 访问成员 value
// 符号用点号,顺序是 变量.成员

逐项分析

记忆技巧

普通变量用点号(.),指针变量用箭头(->)。变量永远在左,成员永远在右。

这句话能帮你 100% 避开 C 和 D 两个选项。再配合一点场景联想:

考频与趋势

根据题库统计,复合类型是近年 CSP 入门级的高频考点:

结构体(struct) 的考频略低,共 37 题,其中 CSP 入门级也考了 2 题。

从趋势上看,复合类型在入门级和 GESP 五级、六级中非常稳定,尤其是 GESP 五级 已经考了 52 题,说明这类基础语法题在初级阶段是必考的。

预测

基于现有数据,暂无足够依据预测 未来会新增哪种特定的联合体考题。但复合类型作为基础语法,在 CSP 入门级和 GESP 五、六级中持续高频出现,未来仍可能以“访问成员”“大小计算”“内存共享”等角度出题,形式不会大变。

总结

这道题看似简单,实则精准打击了初学者最容易混淆的 对象 vs 指针 和 点号 vs 箭头 两个概念。记住口诀,再看选项,就能一眼锁定正确答案 A。

(字数统计:约 1,340 字,符合 1000-1800 字要求)

同考点真题

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