C语言 之 结构体超详细总结

 🌈 个人主页:白子寰
🔥 分类专栏:魔法指针,进阶C++,C语言,C语言题集,C语言实现游戏👈 希望得到您的订阅和支持~
💡 坚持创作博文(平均质量分78.8+),分享更多关于深度学习、C/C++领域的优质内容!  (希望得到您的关注~)  

目录

结构体的创建

结构体变量的定义和初始化

变量的定义

初始化

结构体嵌套结构体 

 结构体访问成员

方式一:使用 . 访问

方式二:用指针访问

 结构体与函数

结构体内存对齐

对齐规则

示例 

①段代码

②段代码 

 代码结果解释:​

代码结果解释

修改默认对齐数 


 

注:为保证讲解的逻辑性,以下👇代码按顺序逐步添加

结构体的创建

举个栗子:创建结构体学生,包含(学号,名字,性别,成绩)

struct student
{int id;       //学号char name[5]; //名字char sex[4];  //性别double scorce;//成绩
};

 

结构体创建👆解释 


 

结构体变量的定义和初始化

变量的定义

struct student
{int id;       //学号char name[5]; //名字char sex[4];  //性别double scorce;//成绩
}p1;              //定义一:定义变量p1struct student p2;//定义二:定义结构体变量p2

 

初始化

struct student
{int id;       //学号char name[5]; //名字char sex[4];  //性别double scorce;//成绩
}p1;              //定义一:定义变量p1struct student p2;//定义二:定义结构体变量p2struct student p3 = { 1,"bai","nan",99.9 };//初始化一
struct student p4 = { .sex = "nan",.name = "ran",.id = 2,.scorce = 88.8 };//二:指定顺序初始化

 

结构体嵌套结构体 

//出生日期数据
struct Data
{int year;  int month;int day;
};
struct student
{int id;       //学号char name[5]; //名字char sex[4];  //性别double scorce;//成绩struct Data birthday;//结构体嵌套结构体
}a1 = { 1,"bai","nan",99.9,{2003,8,27} };         //结构体嵌套初始化一struct student a2 = { .birthday = {2006,8,23},.id = 2,.name = "ran",.scorce = 88.8,.sex = "nan" };//结构体嵌套初始化二

 

 结构体访问成员

方式一:使用 . 访问

struct student
{int id;       //学号char name[5]; //名字char sex[4];  //性别double scorce;//成绩
}p1;              //定义一:定义变量p1struct student p2;//定义二:定义结构体变量p2struct student p3 = { 1,"bai","nan",99.9 };//初始化一
struct student p4 = { .sex = "nan",.name = "ran",.id = 2,.scorce = 88.8 };//二:指定顺序初始化int main()
{printf("id = %d\nname = %s\nsex = %s\nscorce = %.2lf\n", p3.id, p3.name, p3.sex, p3.scorce);//用 . 访问成员return 0;
}

 


 

方式二:用指针访问

struct student
{int id;       //学号char name[5]; //名字char sex[4];  //性别double scorce;//成绩
}p1;              //定义一:定义变量p1struct student p2;//定义二:定义结构体变量p2struct student p3 = { 1,"bai","nan",99.9 };//初始化一
struct student p4 = { .sex = "nan",.name = "ran",.id = 2,.scorce = 88.8 };//二:指定顺序初始化int main()
{//访问成员方式一printf("id = %d\nname = %s\nsex = %s\nscorce = %.2lf\n", p3.id, p3.name, p3.sex, p3.scorce);//用 . 访问成员//访问成员方式二struct student* t = &p4;printf("id = %d\nname = %s\nsex = %s\nscorce = %.2lf\n", t->id, t->name, t->sex, t->scorce);//用指针->访问成员return 0;
}

 

(*p). 成员名( .  的优先级高于 * ,(*p)两边括号不能少)


 

 结构体与函数

struct student
{int id;       //学号char name[5]; //名字char sex[4];  //性别double scorce;//成绩
};void print(struct student* p)//形参:结构体指针变量
{printf("id = %d\nname = %s\n", p->id, p->name);//打印学号和名字
}
int main()
{struct student p = { 1,"bai","nan",99.9 };//定义p和初始化print(&p);//传p的地址return 0;
}

 

控制台输出:


结构体内存对齐

对齐规则

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

2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处

  对齐数 = 编译器默认的⼀个对齐数与该成员变量大小的较小值。

  VS默认对齐数为8

  Linux中gcc没有默认对⻬数,对齐数就是成员自身的大小

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

4. 嵌套结构体,嵌套的结构体成员对齐到自己的成员中最⼤对齐数的整数倍处,结构体的整体大小就是所有最⼤对齐数(含嵌套结构体中成员的对齐数)的整数倍

先看下面👇两段代码


 

示例 

①段代码

struct s1
{char c1;int i;char c2;
};int main()
{printf("%zd\n", sizeof(struct s1));return 0;
}

 

②段代码 

struct s1
{char c1;char c2;int i;
};int main()
{printf("%zd\n", sizeof(struct s1));return 0;
}

 

 代码结果解释:

 
③段代码:嵌套结构体

struct S1
{
double d;
char c;
int i;
};struct S2
{
char c1;
struct S1 s1;
double d;
};int main()
{printf("%zd\n", sizeof(struct S2));return 0;
}

 

代码结果解释

 

小结:结构体的内存对齐是拿空间来换取时间的做法。


 

修改默认对齐数 

#pragma (一个预处理指令):可以改变编译器的默认对齐数

#pragma pack(1)  //设置默认对齐数为1
struct s1
{char c1;char c2;int i;
};//#pragma pack()  //取消默认对齐数,还原为默认
int main()
{printf("%zd\n", sizeof(struct s1));return 0;
}

 

控制台输出:6


 ***********************************************************分割线*****************************************************************************
完结!!!
感谢浏览和阅读。

等等等等一下,分享最近喜欢的一句话:

“你只管去做,不要在意别人的目光,最后的结果总是会让人满意的”。

我是白子寰,如果你喜欢我的作品,不妨你留个点赞+关注让我知道你曾来过。
你的点赞和关注是我持续写作的动力!!! 
好了划走吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/543518.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文件包含例子

一、常见的文件包含函数 php中常见的文件包含函数有以下四种: include() require() include_once() require()_once() include与require基本是相同的,除了错误处理方面: include(),只生成警告(E_WARNING)&#x…

什么是 KNIME Hub(2024)

什么是 KNIME Hub KNIME Hub 是一个中央存储库和协作平台,它是用来促进与 KNIME Analytics Platform(分析平台,AP)相关的工作流、节点、组件和扩展的共享和管理。它既充当工作流存储库又充当协作空间,使用户能够发现和利用可合并到其数据分析项目中的各种…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:StepperItem)

用作Stepper组件的页面子组件。 说明: 该组件从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 子组件 支持单个子组件。 接口 StepperItem() 属性 参数名参数类型参数描述prevLabelstring设置左侧文本按钮内…

解析编程中不可或缺的基础:深入了解结构体类型

精琢博客,希望可以给大家带来收获~ 博主主页:17_Kevin-CSDN博客 收录专栏:《C语言》 引言 在编程中,结构体是一种自定义的数据类型,它允许开发人员将不同类型的数据组合在一起,并为其定义相关属性和行为。…

德人合科技 | 公司办公终端、电脑文件资料 \ 数据透明加密防泄密管理软件系统

天锐绿盾是一款全面的企业级数据安全解决方案,它专注于为企业办公终端、电脑文件资料提供数据透明加密防泄密管理。 首页 德人合科技——www.drhchina.com 这款软件系统的主要功能特点包括: 1. **透明加密技术**: 天锐绿盾采用了透明加密技…

【Java刷题篇】滑动窗口

文章目录 📃滑动窗口📜基本概念📜核心思路 ✍最大连续1的个数 III✍水果成篮 📃滑动窗口 📜基本概念 滑动窗口是一种基于双指针的一种思想,两个指针指向的元素之间形成一个窗口。 分类:窗口有…

瑞熙贝通实验室安全培训考试系统

一、系统概述 瑞熙贝通实验室安全培训考试系统是一种基于互联网和人工智能技术的在线考试平台,旨在旨在提供实验室安全教育和考核的全面解决方案。该系统可以帮助实现实验室安全培训考试的在线化、智能化和规范化,提高实验室安全意识和能力,…

​如何使用 ArcGIS Pro 分析爆炸波及建筑

假设在某栋建筑内发生了爆炸,需要根据爆炸的范围分析出来波及的建筑,对于这一需求,我们可以通过ArcGIS Pro来实现,这里为大家介绍一下分析的方法,希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载…

HTML实现卷轴动画完整源码附注释

动画效果截图 页面的html结构代码 <!DOCTYPE html> <html> <head lang=

京东云主机+京美建站SaaS版

京美建站SaaS版 京美建站搭建企业网站、小程序、3000精美模板 链接:https://daili.jd.com/s?linkNo57UBX34BZMWGNFYTOCPVUE7SN36CCIPKLTFLPCUCPYBKSYYBIPS2BJ57GP7RACLDHU66X526ZOULMIXL2VN7DT7IHU 京东云主机&#xff0c;安全稳定&#xff0c;性能强劲&#xff0c;新客下单…

修复 error Delete `␍` prettier/prettier 错误

修复 error Delete ␍ prettier/prettier 错误 问题背景报错信息报错原因解决办法修改CRLF----针对单个文件yarn run lint --fix 一键修复&#xff08;官方提供&#xff09; 问题背景 今天在使用 openapi 自动生成前端接口代码的时候&#xff0c;爆了一个类似 eslint 规范的错…

不可变集合

2. 3. 如果键值对超过10个的话 优化之后 要生成不可变的集合直接使用copyof就可以