C语言---结构体

文章目录

  • [1. 结构体的定义](#1. 结构体的定义)
  • [2. 定义结构体变量与初始化](#2. 定义结构体变量与初始化)
  • [3. 访问结构体成员](#3. 访问结构体成员)
    • [3.1、圆点运算符 . :用于访问普通结构体变量的成员。](#3.1、圆点运算符 . :用于访问普通结构体变量的成员。)
    • [3.2、箭头运算符 -> :用于通过 结构体指针 访问成员。](#3.2、箭头运算符 -> :用于通过 结构体指针 访问成员。)
  • [4. 使用 typedef 简化](#4. 使用 typedef 简化)
  • [5. 结构体嵌套](#5. 结构体嵌套)
  • [6. 结构体的大小与内存对齐](#6. 结构体的大小与内存对齐)
  • [7. 结构体与数组、函数](#7. 结构体与数组、函数)

在C语言中,结构体(Struct) 是一种复合数据类型,它允许你将不同类型的数据(如 int, char, float 等)组合成一个整体。
结构体是C语言处理复杂物体(如:学生、书籍、车辆等)的核心工具,是面向对象编程思想的基础。

1. 结构体的定义

使用关键字 struct 来定义结构体。

bash 复制代码
struct Student {
    char name[20];   // 姓名
    int age;         // 年龄
    float score;     // 成绩
}; // 注意分号不能掉

2. 定义结构体变量与初始化

定义好结构体模板后,可以创建变量:

2.1、先定义后初始化

bash 复制代码
struct Student s1;
s1.age = 18;
strcpy(s1.name, "Tom");
s1.score = 88.5;

2.2、定义时直接初始化

bash 复制代码
struct Student s2 = {"Jerry", 19, 92.0};

3. 访问结构体成员

访问成员有两种常用的操作符:

3.1、圆点运算符 . :用于访问普通结构体变量的成员。

bash 复制代码
printf("姓名: %s", s2.name);

3.2、箭头运算符 -> :用于通过 结构体指针 访问成员。

bash 复制代码
struct Student *ptr = &s2;
printf("年龄: %d", ptr->age); // 等价于 (*ptr).age

4. 使用 typedef 简化

在C语言中,每次定义变量都要写 struct Student 比较繁琐。使用 typedef 可以定义别名:

bash 复制代码
typedef struct {
    int year;
    int month;
    int day;
} Date;

// 之后就可以直接用 Date 定义变量,不需要加 struct
Date birthday = {2023, 10, 1};

5. 结构体嵌套

一个结构体内部可以包含另一个结构体作为成员。

bash 复制代码
struct Teacher {
    char name[20];
    Date birth; // 嵌套上面定义的 Date 结构体
};

6. 结构体的大小与内存对齐

结构体的大小并不总是其所有成员大小之和。

内存对齐:为了提高CPU读取内存的效率,编译器会按照一定的规则在成员之间插入填充字节(padding)。

可以使用 sizeof(struct Student) 来查看其实际占用的字节数。

7. 结构体与数组、函数

结构体数组:可以创建结构体列表。

struct Student class130;

作为函数参数:

值传递:将整个结构体拷贝一份传给函数(开销较大)。

地址传递(推荐):通过传递指针来操作结构体,效率更高。

相关推荐
罗湖老棍子2 小时前
Biorhythms(信息学奥赛一本通- P1639)
算法·数论·裴蜀定理·扩展欧几里得·扩展中国剩余定理
“AI国潮设计-小江”7 小时前
《Python+SDXL实战:用ControlNet精准控制“英歌舞翻糖吐司”构图,附批量生成脚本》
开发语言·人工智能·python·prompt·aigc
程序喵大人7 小时前
【C++入门】编译链接模型 - 01 一个 C++ 程序是怎样变成可执行文件的
开发语言·c++·编译链接模型
奋发向前wcx7 小时前
CSP-J复赛模拟赛4 王晨旭补题 2026.10.5
算法
sunshine22 girl8 小时前
Java学习七 Java 项目实战1-项目创建和主页面搭建
java·开发语言·学习
菜鸟~noob2339 小时前
【电子战】第三季预告—波武器与电子系统强力毁伤
开发语言·数据库·matlab·电子战
念何架构之路10 小时前
zap采样器与性能优化内幕
算法·性能优化·哈希算法
惊讶的猫10 小时前
工具选对之后还不够:商城 Agent 的参数与权限治理
开发语言·python
cmpxr_10 小时前
【MicroPython】如何刷新ESP8266的固件
开发语言·micropython
搭贝10 小时前
上厕所的时间搭好一套系统:AI自动生成实测
开发语言·人工智能·低代码·ai·php·搭贝