零零雨天飒风图书馆记下
先来看结构体的”结构“
| struct 结构体类型名{ |
| 成员1; |
| 成员2; |
| .....; |
| }结构体变量名; |
系统不会为 struct 结构体类型 分配空间 而是为结构体变量分配空间
| 关于结构体变量命名 |
| 在main函数中 |
| struct 结构体类型名 结构体变量名 如:struct Stu a={初始化复制}; |
| 或者在定义结构体类型的同时定义结构体变量 同样可以初始化 |
关于结构体变量的成员访问:
通过运算符 ”.“还有指针->
- 赋值
- 访问
- 该值
看一个简单例子:
| |
| struct Stu { |
| int id; |
| char name[10]; |
| char sex[10]; |
| } a = {1, "高远", "女"}; |
| |
| void print(struct Stu *p) { |
| //结构体指针变量->成员名 |
| printf("%d,%s,%s\n", (*p).id, (*p).name, (*p).sex); |
| printf("%d,%s,%s\n", p->id, p->name, p->sex); |
| } |
| |
| //直接传递结构体 会占用内存性能 |
| void print2(struct Stu b) { |
| printf("%d,%s,%s\n", b.id, b.name, b.sex); |
| } |
| |
| struct Peo { |
| struct Stu c; |
| int num; |
| }; |
| |
| int main() { |
| //struct 结构体类型名 结构体变量名(对象) |
| struct Stu b = {2, "哈哈", "男"}; |
| //结构体对象.成员变量 |
| printf("%d,%s,%s\n", a.id, a.name, a.sex); |
| printf("%d,%s,%s\n", b.id, b.name, b.sex); |
| print(&b); |
| print2(b); |
| //结构体嵌套 |
| struct Peo gao = {{3, "低近", "女"}, 25}; |
| //printf 函数不能直接打印一个结构体(如 gao.c)作为一个整体 |
| printf("%d,%s,%s,%d", gao.c.id, gao.c.name, gao.c.sex, gao.num); |
| } |
| |
上面也讲述了关于结构体的嵌套和传参 尽量使用地址传参
重点来看关于结构体变量的存储 内存对齐
| 1.第一个成员在结构体变量偏移量为0的地址处 |
| 2.其他成员变量要对齐到对齐数的整数倍地址处 |
| 3.结构体总大小为最大对齐数的整数倍 |
| 4.结构体嵌套的结构体对齐到最大对齐数的整数倍处 |
| 对齐数=默认对齐数(编译器8)和该成员大小的较小值 |
很抽象 实际很简单 直接看例子
| #include "stdio.h" |
| |
| struct s3 { |
| double d; |
| char c; |
| int i; |
| }; |
| struct s4 { |
| char c1; |
| struct s3 s3; |
| double d; |
| }; |
| |
| int main() { |
| printf("%d\n", sizeof(struct s3)); |
| printf("%d\n", sizeof(struct s4)); |
| } |
分析


关于枚举和共用体
| 枚举类型 可以一一列举 |
| enum sex { |
| man = 5, |
| woman = 6 |
| }; |
| enum data { |
| zero, |
| one |
| }; |
| 关于共用体union内存对齐 |
| 共用同一块空间 |
| 大小为最大成员大小 对齐最大对齐数的整数倍 看例子: |
| |
| union aa { |
| int a; |
| char b[5]; |
| |
| }; |
| union bb { |
| int d1; |
| float d2; |
| } t; |
| |
| int main() { |
| printf("%d\n", sizeof(union aa)); |
| t.d1 = 99; |
| } |
然后还有个 typedef 数据类型 别名
记录一些错题:
| typedef long int BIG作用: |
| 定义了一个新的数据类型标识符 |
| 声明结构体类型的同时 系统为其分配存储空间 X |
| 在程序中不可使用和结构体类型中的成员名相同的变量名 X |
| 共用体类型中不能使用结构体 X |
| 共用体中的成员必须具有相同的类型 X |
| 在一个共用体变量中 可以同时对多个成员赋值 X |
| 结构体名在定义结构体时不可以省略 X |
| 共用体变量初始化只能有一个常量 |
| 若修改了共用体变量中某个成员的值 则其他成员的值也会改变 |
| //定义一个结构体变量包括年月日 计算当天在本年中是第几天 考虑闰年问题 |
| |
| |
| struct time { |
| int year; |
| int month; |
| int day; |
| }; |
| |
| void print(struct time com) { |
| int ok[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; |
| int result = 0; |
| if (com.year % 4 == 0 && com.year % 100 != 0 || com.year % 400 == 0) { |
| ok[1] = 29; |
| } |
| for (int i = 0; i < com.month - 1; ++i) { |
| result += ok[i]; |
| } |
| printf("最终结果为:%d", result + com.day); |
| } |
| |
| int main() { |
| int a, b, c; |
| printf("输入今天的日期:"); |
| scanf("%d %d %d", &a, &b, &c); |
| printf("年:%d 月:%d 日:%d\n", a, b, c); |
| struct time com = {a, b, c}; |
| print(com); |
| } |
| |
| #include <stdio.h> |
| struct Month { |
| char name[20]; |
| int days; |
| }; |
| int main() { |
| struct Month months[] = { |
| {"January", 31}, |
| {"February", 28}, |
| {"March", 31}, |
| {"April", 30}, |
| {"May", 31}, |
| {"June", 30}, |
| {"July", 31}, |
| {"August", 31}, |
| {"September", 30}, |
| {"October", 31}, |
| {"November", 30}, |
| {"December", 31} |
| }; |
| for (int i = 0; i < 12; i++) { |
| printf("%s %d \n", months[i].name, months[i].days); |
| } |
| |
| return 0; |
| } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库