一文读懂 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、数组、嵌套,能灵活应对各种复杂数据场景

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

相关推荐
书源14 小时前
AI 时代写给前端同行:什么在贬值,什么在涨价
前端·程序员·ai编程
纯爱掌门人16 小时前
从 Agent 到 Harness:AI 进入研发流程,真正缺的是什么?
人工智能·程序员·agent
神奇小汤圆16 小时前
解密 Pi 的 Harness 工程:Agent 会话如何实现持久化与恢复
程序员
爱勇宝17 小时前
《道德经》第 10 章:真正成熟的人,能成事但不控制一切
前端·后端·程序员
两万五千个小时18 小时前
DeepSeek Harness 从 0 开始:09 System Prompt 模块(提示词组装)
人工智能·程序员·架构
码路漫漫18 小时前
人类程序员还有用,记一次 GPT 把 Figma 两个接口搞反的事
人工智能·程序员
卡卡罗特学AI21 小时前
AI 会话太多总记混,我干脆写了个菜单栏插件
程序员
PC2005_cloud21 小时前
Go学习笔记:错误处理——没有异常,只有 error
程序员
程序员cxuan21 小时前
我用 DeepSeek-V4-Pro,完美复刻了苹果官网
人工智能·后端·程序员
windliang1 天前
Agent 开发到底做什么:Agent、Harness 基础概念
人工智能·算法·程序员