结构体初识-程序员宅基地

技术标签: c语言  开发语言  

一.结构体的定义

1.为什么会有结构体

C语言提供了诸如int、char、float 、long等诸多内置类型,但是当我们考虑到一些复杂对象或者情形的时候,这些单一的内置类型并不方便去描述,如学生会有姓名、年龄、成绩、学号等,因此C语言允许程序员自定义类型来应对这些情况。结构体便是自定义类型的其中一种。

二.结构体的定义和初始化

1.结构体的基本结构

结构体就是一些值的结合,这些值被称为结构体的成员变量。成员变量的类型可以是标量、数组、指针各种类型。

2.结构体变量的创建

a.类型声明时定义

但是该方法只能对于同类型的结构体只能用一次,否则就会造成该自定义结构体类型重定义问题,如果想要创建多个变量,只能在s1、s3后追加。

b.类型直接定义

3.结构体变量的初始化

a.一般初始化

b.嵌套初始化

三.结构体的访问操作符

a.直接访问操作符:通过结构体直接访问结构体成员

b.间接访问操作符:通过结构体指针间接访问结构体成员

有的时候我们并不能得到对象名或者直接使用对象,这时我们就需要通过指针以及->来间接访问结构体成员

四.结构体存储时内存对齐

1.对齐规则·:

a.结构体的第一个成员内存首地址对齐到相对于结构体内存起始位置偏移量为0的地方。

注:偏移量即相差了几个字节

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

注:对齐数=编译器默认对齐数与该成员变量大小之间的较小值。
VS编译器默认对齐数为8
Linux中gcc没有默认对齐数,对齐数就是该成员变量大小

c.结构体成员总大小的必须是最大对齐数(每个成员都有一个对齐数,最大对齐数为所有成员对齐数中最大的那个)的整数倍

注:数组的对齐数是按照它的单个元素大小计算

d.如果结构体存在成员是结构体的嵌套情况,嵌套的结构体成员对齐到自己成员中最大对齐数的整数倍处,结构体最大数是连嵌套结构体成员对齐数的所有对齐数的最大值。

2.为什么会存在内存对齐

a.平台原因 (移植原因):

某些硬件平台只能在某些地址处取某些特定类型的数据,如按照偏移量为4、8、16......等读取,否则抛出硬件异常。

b.性能原因:

假设⼀个处理器总是从内存中取4个字节,则地址必须是4的倍数,如上如图,同样是访问int类型的数据,对于未对⻬的内存,因为对象被分放在两个4字节内存块中。处理器需要作两次内存访问;⽽对⻬的内存访问仅需要⼀次访问,就可读取处全部数据。因此,如果我们能保证将所有的int类型的数据的地址都对⻬成4的倍数,那么就可以⽤⼀个内存操作来读或者写值了。否则,我们可能需要执⾏两次内存访问。

总的来说:结构体这种内存对齐的设计是一种牺牲空间换时间的做法,随着大家学习的深入,我们还会学习到位端这种追求节省空间的做法,不过因为本文仅是主要是“初识”,因此,笔者在这里便不再过多介绍了。在此对于给好奇的读者造成的不便致以歉意。

小技巧:对于结构体的内存对齐这一现象,如果我们让占空间小的成员尽量集中在一起,我们便可以相对达到既节省空间又赢得时间的效果。

3.默认对齐数的修改

#pragma 这个预处理指令,可以改变编译器的默认对⻬数。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/2401_82610555/article/details/136997830

智能推荐

详解冬奥冠军背后的AI黑科技-程序员宅基地

文章浏览阅读3.6k次。用人工智能普惠体育发展。

form表单提交的几种方式_提交表单-程序员宅基地

文章浏览阅读10w+次,点赞92次,收藏495次。表单提交方式一:直接利用form表单提交html页面代码:<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Insert title here</title></head><body><form action="h..._提交表单

Unity Spine SkeletonGraphic 动画重复播放 过度残影透明渐变Bug 解决方案_unity skeletongraphic-程序员宅基地

文章浏览阅读5.1k次。Unity Spine SkeletonGraphic 重复播放 过度残影Bug 解决方案不推荐使用SetToSetupPose和Setup Pose相关,代码直接贴上/// <summary>/// Spine播放设置/// </summary>/// <param name="trackIndex">填写0</param>/// <param name="animationName">动画名</param>/// &l_unity skeletongraphic

高斯分布3——边缘概率与条件概率_高斯分布的条件概率-程序员宅基地

文章浏览阅读3.5k次。一、推导过程:二、结果:边缘分布x1,x2 各自依然服从 μi,写反差矩阵 Σii 的多元高斯分布;条件概率分布给定 xj 求 xi 的分布:μi|j=μi+ΣijΣ−1jj(xj−μj)Σi|j=Σjj−ΣTijΣ−1iiΣij..._高斯分布的条件概率

Ratelimitcache: Python缓存库,支持速率限制-程序员宅基地

文章浏览阅读339次,点赞8次,收藏8次。Ratelimitcache: Python缓存库,支持速率限制项目链接: https://gitcode.com/simonw/ratelimitcache?utm_source=artical_gitcode如果你正在寻找一个Python缓存库,并且希望对缓存操作进行速率限制,那么Ratelimitcache可能是你的理想选择。什么是Ratelimitcache?Ratelimitca..._python ratelimit基于什么

【爬虫】Xpath和CSS信息提取的方法异同点_xpath 获取css-程序员宅基地

文章浏览阅读2.3k次,点赞2次,收藏8次。Xpath和CSS信息提取的方法异同点_xpath 获取css

随便推点

基于OFDM+64QAM系统的载波同步matlab仿真,输出误码率,星座图,鉴相器,锁相环频率响应以及NCO等-程序员宅基地

文章浏览阅读454次。正交频分复用(OFDM)是一种在现代通信系统中广泛使用的调制技术,它具有高效的频谱利用和抗多径衰落等特点。64QAM(64-ary Quadrature Amplitude Modulation)是一种调制方式,可以在每个符号中传输更多的位信息。在OFDM系统中,保持载波同步对确保数据传输的可靠性至关重要。_基于ofdm+64qam系统的载波同步matlab仿真,

Springboot毕设项目超市商品销售管理系统37x2w(java+VUE+Mybatis+Maven+Mysql)_vue+springboot+mybatis商品管理系统-程序员宅基地

文章浏览阅读67次。Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。若包含,则为maven项目,否则为非maven项目。Springboot毕设项目超市商品销售管理系统37x2w(java+VUE+Mybatis+Maven+Mysql)Springboot + mybatis + Maven + Vue 等等组成,B/S模式 + Maven管理等等。其他版本理论上也可以。_vue+springboot+mybatis商品管理系统

关掉\禁用win7自动配置ipv4地址的方法 默认网关自动消失的解决办法_禁止修改网关命令-程序员宅基地

文章浏览阅读3w次,点赞2次,收藏4次。转载自: http://blog.csdn.net/zouqin369/article/details/6913692 今天去公司设置好IP后,无论怎么样都上不了internet,再次打开本地后发现默认网关自动消失,cmd下输入ipconfig后的现象如下: 物理地址. . . . . . . . . . . . . : 00-22-64-55-76-8F DHCP 已启用_禁止修改网关命令

Extjs4.2 window加载HTML,父子页面html传参_extjs中打开网页怎么传参-程序员宅基地

文章浏览阅读482次。Extjs的窗口是可以加载自己的HTML的,但这样两个页面就相当独立了,传参是个问题 ,网上也没有很好的解答清楚,猫猫今天就说清楚这个模式的传参要点。_extjs中打开网页怎么传参

计算机网络复习——Ch3点到点数据链路层_hdlc go-back-n-程序员宅基地

文章浏览阅读1.2k次。Ch3点到点数据链路层知识点1. 点到点数据链路层要解决的主要问题2. 常见的帧管理(帧定界)方法3. CRC的计算4. 流量控制的基本原理5. 常见错误及其处理机制6. 滑动窗口的概念、形式及工作原理7. ARQ(Automatic Repeat reQuest)协议工作原理:8. 连续ARQ(Go-back-N ARQ)工作原理(特别注意累计确认):9. 选择重传ARQ工作原理10. 了解(高..._hdlc go-back-n

推荐文章

热门文章

相关标签