#CSPJ26D17. 2026 年 8 月 CSP-J 初赛 20 日打卡 Day17|结构体、联合体与成员访问

2026 年 8 月 CSP-J 初赛 20 日打卡 Day17|结构体、联合体与成员访问

Day 17 结构体、联合体与成员访问

建议用时:20~25 分钟。请先打开今日知识卡完成复习,再独立提交本页答案。

今日学习资料

复习目标:理解结构体与联合体的存储差异,会使用点号和箭头访问成员,并能追踪结构体数组程序。

今日练习

  1. 【CSP-J 2023·第 3 题】阅读下述代码,请问修改 datavalue 成员以存储 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;
  1. 已知 Student s;,访问对象 s 的成员 score,正确写法是( )。

{{ select(2) }}

  • s->score
  • s.score
  • score.s
  • *s.score
  1. 已知 Student *p = &s;,下列与 p->score 等价的是( )。

{{ select(3) }}

  • *p.score
  • *(p.score)
  • (*p).score
  • p.score
  1. 关于结构体和联合体,下列说法正确的是( )。

{{ select(4) }}

  • 结构体的所有成员共享同一块存储
  • 联合体的所有成员通常可以同时保存互不影响的值
  • 修改一个结构体对象的成员,会自动修改同类型的所有对象
  • 联合体各成员共享存储,程序应明确当前有效成员
  1. 在未说明编译器对齐规则时,关于下列联合体大小的说法最准确的是( )。

    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;
}
  1. 执行 Player *p = &a[1]; 后,p 指向( )。

{{ select(6) }}

  • a[0]
  • a[1]
  • a[2]
  • 整个数组之后的位置
  1. 执行 p->score += p->bonus; 后,a[1].score 的值是( )。

{{ select(7) }}

  • 70
  • 75
  • 78
  • 80
  1. 程序最终输出( )。

{{ select(8) }}

  • 78 5
  • 78 6
  • 80 6
  • 70 3