一文读懂 C 语言结构体:从基础到实践

一文读懂 C 语言结构体:从基础到实践

在 C 语言的世界里,结构体(struct)是一个超实用的自定义数据类型,能帮我们把不同类型的数据打包在一起,完美模拟现实中的复杂事物。今天就用最简单的方式,带你搞定结构体的核心知识点✅


一、什么是结构体?

我们平时用的intcharfloat都是基础数据类型,只能存单一信息。但现实里的事物往往有多个属性,比如一个学生:

  • 学号(整数)
  • 姓名(字符串)
  • 年龄(整数)
  • 成绩(浮点数)

这时候基础类型就不够用了,结构体就是把多个不同类型的变量 "打包" 成一个新类型,专门用来描述这类复杂对象。


二、结构体的基本写法

1. 定义结构体类型

c

运行

arduino 复制代码
// 定义一个描述学生的结构体类型
struct Student {
    int id;       // 学号
    char name[20];// 姓名
    int age;      // 年龄
    float score;  // 成绩
};

这里struct Student就是我们自定义的新类型,和intchar的地位是一样的~

2. 定义结构体变量

有了结构体类型,就可以定义对应的变量了:

c

运行

arduino 复制代码
// 方式1:先定义类型,再定义变量
struct Student stu1;

// 方式2:定义类型的同时定义变量
struct Student {
    int id;
    char name[20];
    int age;
    float score;
} stu2, stu3;

3. 初始化结构体变量

可以在定义变量时直接赋值:

c

运行

ini 复制代码
struct Student stu = {2024001, "张三", 18, 95.5};

三、如何访问结构体成员?

访问结构体成员分两种情况:

1. 普通结构体变量 → 用.操作符

c

运行

arduino 复制代码
#include <stdio.h>

int main() {
    struct Student stu = {2024001, "张三", 18, 95.5};
    
    // 访问并打印成员
    printf("学号:%d\n", stu.id);
    printf("姓名:%s\n", stu.name);
    printf("年龄:%d\n", stu.age);
    printf("成绩:%.1f\n", stu.score);
    
    // 修改成员
    stu.score = 98.0;
    printf("修改后的成绩:%.1f\n", stu.score);
    return 0;
}

2. 结构体指针变量 → 用->操作符

如果是指向结构体的指针,就用->来访问成员:

c

运行

arduino 复制代码
#include <stdio.h>

int main() {
    struct Student stu = {2024001, "张三", 18, 95.5};
    struct Student *p = &stu; // 定义结构体指针
    
    // 用指针访问成员
    printf("学号:%d\n", p->id);
    printf("姓名:%s\n", p->name);
    
    // 修改成员
    p->age = 19;
    printf("修改后的年龄:%d\n", p->age);
    return 0;
}

四、结构体的实用小技巧

1. 用typedef简化结构体名

每次写struct Student太麻烦?用typedef给结构体起别名,代码会更简洁:

c

运行

ini 复制代码
typedef struct {
    int id;
    char name[20];
    int age;
    float score;
} Student; // 给匿名结构体起别名Student

// 之后直接用Student定义变量
Student stu = {2024002, "李四", 19, 88.5};

2. 结构体数组:批量管理对象

如果有多个学生,用结构体数组最方便:

c

运行

perl 复制代码
Student stu_arr[3] = {
    {2024001, "张三", 18, 95.5},
    {2024002, "李四", 19, 88.5},
    {2024003, "王五", 18, 90.0}
};

// 遍历打印数组
for(int i=0; i<3; i++){
    printf("第%d个学生:%s 学号%d 成绩%.1f\n", i+1, stu_arr[i].name, stu_arr[i].id, stu_arr[i].score);
}

3. 结构体嵌套:模拟更复杂的关系

结构体里还能套结构体,比如给学生加一个 "地址" 属性:

c

运行

arduino 复制代码
// 地址结构体
typedef struct {
    char province[10]; // 省份
    char city[10];     // 城市
} Address;

// 学生结构体(嵌套Address)
typedef struct {
    int id;
    char name[20];
    int age;
    float score;
    Address addr; // 嵌套地址
} Student;

// 初始化嵌套结构体
Student stu = {
    2024001, "张三", 18, 95.5,
    {"广东省", "深圳市"}
};

// 访问嵌套成员
printf("地址:%s %s\n", stu.addr.province, stu.addr.city);

五、结构体的常见应用场景

  • 数据封装:把相关数据打包,让代码逻辑更清晰,比如描述图书、员工、订单等对象。
  • 函数传参:把多个参数打包成一个结构体传给函数,减少参数数量,让代码更易维护。
  • 链表实现:结构体是实现链表、树等数据结构的基础,是 C 语言数据结构的核心工具。

六、小总结

结构体是 C 语言里的 "数据打包神器",核心就是:

  1. struct定义自定义类型
  2. .->访问成员
  3. 配合typedef、数组、嵌套,能灵活应对各种复杂数据场景

下次再遇到需要描述复杂对象的需求,不妨试试用结构体,代码会变得更整洁哦~

相关推荐
陈随易4 小时前
向日葵+AI,远程操控又进化了
前端·后端·程序员
阿里嘎多学长4 小时前
2026-03-15 GitHub 热点项目精选
开发语言·程序员·github·代码托管
阿里嘎多学长20 小时前
2026-03-11 GitHub 热点项目精选
开发语言·程序员·github·代码托管
树獭非懒21 小时前
Ghostty + Claude 终极开发体验:5 分钟打造你的“幽灵搭档”终端
程序员
程序员鱼皮21 小时前
【后端必看】什么是 Elasticsearch?都要学什么?
java·数据库·程序员·编程·后端开发
星哥说事1 天前
MacOS系统安装OpenClaw安装避坑指南!保姆级教程,零踩坑
程序员
舒一笑1 天前
Windows 使用 Codex / AI 编程时 IDEA 中文乱码?一篇文章彻底解决
后端·程序员·intellij idea
阿里嘎多学长1 天前
2026-03-14 GitHub 热点项目精选
开发语言·程序员·github·代码托管
甲鱼9292 天前
FreeSWITCH 对接 SIP 中继踩坑记录
后端·程序员