首页...结构体与共用体详解——C语言程序设计(二级考试)
C语言程序设计第八章 结构体与共用体/第二节

结构体与共用体详解——C语言程序设计(二级考试)

2026-03-24

第八章 结构体与共用体

第二节 结构体的定义与使用

概述

本节内容主要围绕C语言中的结构体(struct)展开,深入讲解结构体的定义、声明、访问及其在实际编程中的应用。结构体作为一种用户自定义的数据类型,可以将不同类型的数据组合在一起,极大地丰富了C语言的数据表达能力。通过本节学习,考生将掌握结构体的语法规则、操作方法及常见编程技巧,为后续复杂数据结构的学习打下坚实基础。

核心概念

  • 结构体(struct):一种用户自定义的数据类型,可以把多个不同类型的数据组合成一个整体。
  • 成员变量:结构体中定义的各个字段,每个成员可以是不同类型。
  • 结构体变量:基于结构体类型定义的变量,包含所有成员变量。
  • 结构体标签(tag):结构体定义时的名称,用于声明结构体变量。
  • 结构体指针:指向结构体变量的指针,便于动态操作结构体。

原理分析

结构体的底层实现是在内存中按成员顺序连续分配空间。每个成员都有自己的偏移地址,编译器根据成员类型和对齐规则计算偏移量。通过结构体名和成员名,可以方便地访问和操作结构体中每个数据。结构体不仅支持基本数据类型成员,还可以嵌套其他结构体,实现复杂数据的层次化管理。

详细内容

1. 结构体的定义与声明

结构体的定义格式为:

struct 结构体标签 {
    成员类型1 成员名1;
    成员类型2 成员名2;
    ...
};

定义完成后,可以通过struct 结构体标签 变量名;声明变量。示例:

struct Student {
    char name[20];
    int age;
    float score;
};
struct Student stu1;

注意:结构体定义结束后必须加分号。

2. 结构体变量的初始化

结构体变量可以在定义时初始化,语法如下:

struct Student stu1 = {"张三", 18, 89.5};

初始化顺序必须与成员定义顺序一致。C99之后支持指定初始化:

struct Student stu1 = {.age=18, .score=89.5, .name="张三"};

此方式更安全,避免顺序错误。

3. 访问结构体成员

使用点运算符.访问结构体变量的成员:

stu1.age = 20;
printf("姓名:%s, 年龄:%d", stu1.name, stu1.age);

如果是结构体指针,则使用箭头运算符->

struct Student *p = &stu1;
p->score = 95.0;

4. 结构体数组

结构体数组是结构体变量的集合,便于存储多个同类型的结构体数据。

struct Student class[3];
class[0].age = 18;
class[1].score = 88.0;

可用于批量处理数据。

5. 结构体作为函数参数

结构体变量可以作为函数参数传递,传递方式有两种:

  • 值传递:传递结构体的副本,函数内修改不影响外部。
  • 指针传递:传递结构体地址,函数内可修改外部数据。
    示例:
void printStudent(struct Student stu) { ... }
void updateStudent(struct Student *p) { ... }

推荐使用指针传递,效率更高。

6. 嵌套结构体

结构体成员可以是另一个结构体,实现复杂数据组合。

struct Date {
  int year, month, day;
};
struct Student {
  char name[20];
  struct Date birthday;
};

访问时需多次使用点运算符:

stu1.birthday.year = 2000;

实例分析

实例一:学生信息管理

背景:设计一个程序,存储并打印多个学生的姓名、年龄和成绩。

#include <stdio.h>
struct Student {
    char name[20];
    int age;
    float score;
};

int main() {
    struct Student class[3] = {
        {"李华", 19, 90.5},
        {"王强", 20, 85.0},
        {"赵敏", 18, 92.0}
    };
    for(int i=0; i<3; i++) {
        printf("姓名:%s, 年龄:%d, 成绩:%.1f\n", class[i].name, class[i].age, class[i].score);
    }
    return 0;
}

分析:通过结构体数组存储多个学生信息,使用循环访问打印。
结论:结构体数组简洁高效,适合批量数据处理。

实例二:函数修改结构体成员

背景:定义函数修改学生成绩。

#include <stdio.h>
struct Student {
    char name[20];
    int age;
    float score;
};

void updateScore(struct Student *stu, float newScore) {
    stu->score = newScore;
}

int main() {
    struct Student stu = {"张三", 18, 88.0};
    printf("修改前成绩:%.1f\n", stu.score);
    updateScore(&stu, 95.0);
    printf("修改后成绩:%.1f\n", stu.score);
    return 0;
}

分析:通过指针参数传递结构体,实现修改外部变量。
结论:指针传递提高效率且可修改结构体内容。

实例三:嵌套结构体应用

背景:记录员工信息,包括姓名和出生日期。

#include <stdio.h>
struct Date {
    int year;
    int month;
    int day;
};
struct Employee {
    char name[20];
    struct Date birthday;
};

int main() {
    struct Employee emp = {"李雷", {1990, 5, 20}};
    printf("员工姓名:%s,出生日期:%d-%02d-%02d\n", emp.name, emp.birthday.year, emp.birthday.month, emp.birthday.day);
    return 0;
}

分析:嵌套结构体实现复合数据描述。
结论:嵌套结构体增强数据结构表达能力。

常见误区

  • 误区1:忘记结构体定义后加分号。
    正确做法: 结构体定义结束必须加分号。
  • 误区2:结构体初始化成员顺序错误。
    正确做法: 按定义顺序初始化,或使用指定初始化语法。
  • 误区3:结构体指针访问成员用点运算符。
    正确做法: 指针访问成员应使用箭头运算符->
  • 误区4:函数传递结构体时未使用指针,导致修改无效。
    正确做法: 需要修改时传递结构体指针。
  • 误区5:结构体内部成员类型限制。
    正确做法: 结构体成员可以是任意类型,包括数组和其他结构体。

应用场景

  • 学生成绩管理系统:用结构体保存学生信息,方便批量处理。
  • 员工档案管理:通过嵌套结构体记录复杂信息,如地址、入职日期。
  • 图形界面程序:结构体表示点、矩形等几何图形数据。
  • 网络通信协议:结构体定义数据包格式,便于数据封装和传输。
  • 游戏开发:存储游戏角色属性,如位置、状态、装备等。

知识拓展

  • 结构体内存对齐与填充:了解编译器如何对齐结构体成员,影响内存使用和效率。
  • 共用体(union)与结构体对比:共用体成员共享内存,节省空间但不同时存储。
  • 位域结构体:节省内存,适合存储状态标志。
  • typedef与结构体结合使用:简化结构体类型定义。
  • 动态分配结构体内存:与malloc配合使用,实现动态数据结构。

总结回顾

本节详细讲解了C语言结构体的定义、声明、初始化、访问及其应用。结构体作为一种复合数据类型,极大增强了程序的数据组织能力。掌握结构体的正确使用方法,包括结构体变量、结构体指针、结构体数组及嵌套结构体,是C语言程序设计的重要基础。通过实例分析,强化了理论知识的实际应用能力。理解并避免常见误区,将帮助考生在考试中准确无误地运用结构体知识。结构体的灵活运用广泛应用于管理复杂数据、设计高效程序,是考生必须掌握的核心技能。


推荐复习要点

  • 结构体定义语法及注意事项
  • 结构体变量的声明与初始化
  • 成员访问的点运算符与箭头运算符区别
  • 结构体数组与函数参数传递方式
  • 嵌套结构体的使用场景及访问方法

掌握以上内容,能够帮助考生系统理解并灵活运用结构体,顺利通过全国计算机等级考试二级C语言程序设计部分。

重点知识点

1

结构体的定义及语法规则

2

结构体变量的声明与初始化方法

3

使用点运算符和箭头运算符访问成员的区别

4

结构体数组的声明与使用

5

结构体作为函数参数的传递方式(值传递与指针传递)

6

嵌套结构体的定义与访问

7

结构体使用中的常见错误及规范做法

8

结构体在实际编程中的典型应用场景

9

结构体内存布局原理及对齐问题

10

结构体与共用体、位域的区别与联系