news 2026/1/11 5:22:05

C语言结构体

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言结构体

目录

一 结构体类型的声明

1.结构体回顾

(1)结构的声明

(2)结构体变量的创建和初始化

2.结构的特殊声明

3.结构的⾃引⽤

4. 结构体内存对⻬

(1)对⻬规则

5. 结构体传参


一 结构体类型的声明

1.结构体回顾

结构是⼀些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。

(1)结构的声明

例如描述⼀个学⽣:

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() { struct Student { char name[20];//姓名 int age;//年龄 char sex[10];//性别 }; return 0; }
(2)结构体变量的创建和初始化
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() { struct Student { char name[20];//姓名 int age;//年龄 char sex[10];//性别 }; struct Student a = { "张三",18,"男" }; printf("%s\n", a.name); printf("%d\n", a.age); printf("%s\n", a.sex); return 0; }

这是按照我们创建的结构体的顺序进行初始化的,下面我再来介绍另一种的初始化的方式;

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() { struct Student { char name[20];//姓名 int age;//年龄 char sex[10];//性别 }; struct Student a = { .age = 18,.name = "张三",.sex = "男" }; printf("%s\n", a.name); printf("%d\n", a.age); printf("%s\n", a.sex); return 0; }
2.结构的特殊声明

在声明结构的时候,可以不完全的声明。

例如:

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() { struct { char name[20];//姓名 int age;//年龄 char sex[10];//性别 }a; a.age = 18; /*printf("%s\n", a.name);*/ printf("%d\n", a.age); /*printf("%s\n", a.sex);*/ return 0; }

上⾯的结构在声明的时候省略掉了结构体标签(tag)。

匿名的结构体类型,如果没有对结构体类型重命名的话,基本上只能使⽤⼀次。

3.结构的⾃引⽤

在结构中包含⼀个类型为该结构本⾝的成员是否可以呢?

⽐如,定义⼀个链表的节点:

struct NODE { int x; struct NODE next; };

这样的代码行得通吗?

如果正确,那 sizeof(struct Node) 是多少?

仔细分析,其实是不⾏的,因为⼀个结构体中再包含⼀个同类型的结构体变量,这样结构体变量的⼤ ⼩就会⽆穷的⼤,是不合理的。

正确的方式:

struct NODE { int x; struct NODE* next; };

在结构体⾃引⽤使⽤的过程中,夹杂了 typedef 对匿名结构体类型重命名,也容易引⼊问题,看看 下⾯的代码,可⾏吗?

typedef struct NODE { int x; NODE* next; }NODE;

我们可以看到这里的报错说明这样的写法是错误的,

因为NODE是对前⾯的匿名结构体类型的重命名产⽣的,但是在匿名结构体内部提前使 ⽤NODE类型来创建成员变量,这是不⾏的。

4.结构体内存对⻬

我们已经掌握了结构体的基本使⽤了。

现在我们深⼊讨论⼀个问题:计算结构体的⼤⼩。

这也是⼀个特别热⻔的考点:结构体内存对⻬

(1)对⻬规则

⾸先得掌握结构体的对⻬规则:

1.结构体的第⼀个成员对⻬到和结构体变量起始位置偏移量为0的地址处

2.其他成员变量要对⻬到某个数字(对⻬数)的整数倍的地址处。对⻬数=编译器默认的⼀个对⻬数与该成员变量⼤⼩的较⼩值。

-VS 中默认的值为 8

-Linux中gcc没有默认对⻬数,对⻬数就是成员⾃⾝的⼤⼩;

3.结构体总⼤⼩为最⼤对⻬数(结构体中每个成员变量都有⼀个对⻬数,所有对⻬数中最⼤的)的 整数倍。

4.如果嵌套了结构体的情况,嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处,结构 体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体中成员的对⻬数)的整数倍。

这样听起来很难理解.下面列举个例子:

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() { struct S1 { char c1; int i; char c2; }; printf("%d\n", sizeof(struct S1)); struct S2 { char c1; char c2; int i; }; printf("%d\n", sizeof(struct S2)); return 0; }

我们定义的两个结构体内部的数据的类型相同,只不过顺序不同,那么他们的大小也应该相同.

但是事实真是这样吗?

运行结果如图所示:

为什么是这样的结果?我们来按照对齐规则来逐步解释

下面我们取出较小值:

所以第一个结构体的大小是12.

5. 结构体传参
struct S { int data[1000]; int num; }; struct S s = {{1,2,3,4}, 1000}; //结构体传参 void print1(struct S s) { printf("%d\n", s.num); } //结构体地址传参 void print2(struct S* ps) { printf("%d\n", ps->num); } int main() { print1(s); //传结构体 print2(&s); //传地址 return 0; }

上⾯的 print1 和 print2 函数哪个好些?

答案是:⾸选print2函数。

原因: 函数传参的时候,参数是需要压栈,会有时间和空间上的系统开销。

如果传递⼀个结构体对象的时候,结构体过⼤,参数压栈的的系统开销⽐较⼤,所以会导致性能的下 降。

结论: 结构体传参的时候,要传结构体的地址。

结构体的内容就结束了.

谢谢大家的观看.

之后我会讲解联合体和枚举的相关语法知识.

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/27 7:58:47

28、系统与数据模型全解析:从基础到实践

系统与数据模型全解析:从基础到实践 1. 系统模型概述 在系统设计与分析领域,有多种重要的模型,它们各自有着独特的功能和用途。 - 系统流(System Flows) :可用于表示错误处理过程,帮助我们在系统出现问题时进行有效的应对和处理。 - 生态系统地图(Ecosystem Map…

作者头像 李华
网站建设 2025/12/25 12:53:52

29、数据建模:BDD与DFD的深度解析

数据建模:BDD与DFD的深度解析 1. 业务数据图(BDD)基础 在数据建模领域,业务数据图(BDD)是一个重要的工具。它能帮助我们从业务视角来理解和展示数据对象之间的关系。例如,学生和课程之间存在多对多的关系,一个学生可以选择任意数量的课程,而一门课程也可以有零到无限…

作者头像 李华
网站建设 2025/12/26 17:19:07

大模型自动化新纪元:Open-AutoGLM与manus协同架构详解,性能提升5倍的秘密

第一章&#xff1a;大模型自动化新纪元的开启 人工智能正以前所未有的速度演进&#xff0c;大语言模型的崛起标志着自动化技术进入全新阶段。这些模型不仅能够理解自然语言&#xff0c;还能生成代码、撰写文档、执行复杂推理&#xff0c;甚至自主完成任务编排。这一变革正在重塑…

作者头像 李华
网站建设 2025/12/27 7:43:51

4、Subversion 使用指南:从基础到实践

Subversion 使用指南:从基础到实践 1. Subversion 工作副本与仓库的跟踪机制 在 Subversion 中,工作副本与仓库的交互是核心操作。假设 Sally 对 integer.c 进行了更改并提交,创建了版本 6。当你使用 svn update 更新工作副本时,会看到如下结果: calc/Makefile:6 …

作者头像 李华
网站建设 2025/12/31 6:06:27

6、Subversion 使用指南:基础操作与历史查看

Subversion 使用指南:基础操作与历史查看 1. 冲突处理 在使用 Subversion 时,可能会遇到文件冲突的情况。当出现冲突时,Subversion 会创建一些临时文件,如 sandwich.txt.mine 、 sandwich.txt.r1 和 sandwich.txt.r2 ,并且在这些临时文件被移除之前,不允许提交 …

作者头像 李华
网站建设 2026/1/9 17:19:52

10、Subversion 高级功能:文件锁定、外部定义及相关操作解析

Subversion 高级功能:文件锁定、外部定义及相关操作解析 1. 文件锁定与提交 在使用 Subversion 进行版本控制时,文件锁定是一个重要的功能,它可以确保同一时间只有一个用户对文件进行修改,避免冲突。 当尝试删除 banana.jpg 并提交时,可能会遇到锁定问题,如下所示:…

作者头像 李华