#CSPJ26D17. 2026 年 8 月 CSP-J 初赛 20 日打卡 Day17|结构体、联合体与成员访问
2026 年 8 月 CSP-J 初赛 20 日打卡 Day17|结构体、联合体与成员访问
Day 17 结构体、联合体与成员访问
建议用时:20~25 分钟。请先打开今日知识卡完成复习,再独立提交本页答案。
今日学习资料
复习目标:理解结构体与联合体的存储差异,会使用点号和箭头访问成员,并能追踪结构体数组程序。
今日练习
-
【CSP-J 2023·第 3 题】阅读下述代码,请问修改
data的value成员以存储3.14,正确的方式是( )。union Data { int num; float value; char symbol; }; union Data data;
{{ select(1) }}
data.value = 3.14;value.data = 3.14;data->value = 3.14;value->data = 3.14;
- 已知
Student s;,访问对象s的成员score,正确写法是( )。
{{ select(2) }}
s->scores.scorescore.s*s.score
- 已知
Student *p = &s;,下列与p->score等价的是( )。
{{ select(3) }}
*p.score*(p.score)(*p).scorep.score
- 关于结构体和联合体,下列说法正确的是( )。
{{ select(4) }}
- 结构体的所有成员共享同一块存储
- 联合体的所有成员通常可以同时保存互不影响的值
- 修改一个结构体对象的成员,会自动修改同类型的所有对象
- 联合体各成员共享存储,程序应明确当前有效成员
-
在未说明编译器对齐规则时,关于下列联合体大小的说法最准确的是( )。
union U { char c; int x; double y; };
{{ select(5) }}
- 一定等于三个成员大小之和
- 至少要能容纳最大的成员,并满足相应对齐要求
- 一定等于 1 字节
- 与成员类型完全无关
主题程序阅读
阅读下面的程序:
#include <iostream>
using namespace std;
struct Player {
int score;
int bonus;
};
int main() {
Player a[3] = {{60, 5}, {70, 8}, {80, 3}};
Player *p = &a[1];
p->score += p->bonus;
a[2].bonus = a[0].bonus + 1;
cout << a[1].score << ' ' << a[2].bonus << endl;
return 0;
}
- 执行
Player *p = &a[1];后,p指向( )。
{{ select(6) }}
a[0]a[1]a[2]- 整个数组之后的位置
- 执行
p->score += p->bonus;后,a[1].score的值是( )。
{{ select(7) }}
- 70
- 75
- 78
- 80
- 程序最终输出( )。
{{ select(8) }}
78 578 680 670 3