浅谈C语言中的结构体知识。

大家好,这篇博客我们讲解一下关于结构体的知识。
第一:初始结构体
在此之前,我们已经学了很多基本的数据结构,例如 char 、short 、int 、float…等类型;这些偶称为内置类型。怎样设计出来属于自己的类型?
基于此种情况,结构体就因此出现了。
程序员可以使用结构体来封装一些属性,设计出新的类型,在C语言中称为结构体类型。
结构体的定义为:
struct 结构体名
{
成员列表(可以是基本的数据类型,指针,数组或其他结构类型)
};
举个代码让大家有个更好的理解,比如我们要描述一个学生的话,我们就需要知道他的姓名,年龄,性别,学号。这几个基本的信息。我们需要一个类型能够同时描述这些情况,并把他们放到一起,此时就可以使用结构体了。
在这里插入图片描述
这个就是一个很经典的结构体使用列子,但我们需要注意以下3点
(1)关键字struct是数据类型说明符,指出下面说的是结构体类型;
(2)标识符Student是结构体的类型名,说明这个结构体具体指啥
(3)最后的分号一定要写;
第二:结构体的初始化
结构体是一种数据类型,也就是说可以用它来定义变量。

结构体就像一个“模板”,定义出来的变量都具有相同的性质。可以将结构体比作“图纸”,结构体变量比作“零件”,根据同一张图纸生产出来的零件的特性都是一样的;

结构体是一种数据类型,是创建变量的模板,不占用内存空间;结构体变量才包含了实实在在的数据、需要存储空间;
在这里插入图片描述
这里初始化结构体是用一个数组的形式将结构体里的成员分别初始化。同时这里访问结构体的成员用了三种方法,
第一种:结构体变量.对象
第二种:
置类型可以定义指针变量,结构体类型也可以定义结构体类型指针;
结构体类型指针访问成员的获取和赋值形式:
(1)(p). 成员名(.的优先级高于,(*p)两边括号不能少)
(2) p->成员名(->指向符)
第三:结构体的嵌套
结构体里也可以嵌套另外一个结构体
在这里插入图片描述
其实结构体嵌套只不过多了一层访问成员变量,我们先要访问struct student里的成员struct birth data,他也是一个结构体,再通过他去访问对应的结构体中成员。
第四:结构体和函数
在这里插入图片描述
第五:结构体和数组
通过结构体和数组的一起使用,我们可以创建多个不同的结构体变量。比如我们要描述一个班级里的不同成员时,对他们每个人的描述都是一样的,如果我们每个人都创建一个结构体就需要多个结构体,这时我们就可以通过结构体和数组的一起使用。使用一个结构体模板,创建多个不同的类。这也是c++里最重要的面向对象的方法。
在这里插入图片描述
第六:结构体对齐
我们想要计算结构体的大小,就先要了解结构体内存对齐的规则
三个规则:
(1)、结构体变量的首地址,必须是结构体变量的“最大基本数据类型成员所占字节数”的整数倍;

(2)结构体变量中的每个成员相对于结构体首地址的偏移量,都是该成员基本数据类型所占字节数的整数倍;

(3)、结构体变量的总大小,为结构体变量中“最大基本数据类型成员所占字节”的整数倍;

示例:假设总零地址开始(计算)先举一个简单的列子:
一、简单结构体对齐数的计算
在这里插入图片描述
红色和绿色的是存了的地址,白色的就是浪费的空间,所以说对齐方式很浪费空间,可是按照计算机的访问规则,这种方式提高了效率。
从上可以看出,该结构体的大小为:1 + 4 + 1 + 3(浪费的空间(白色)) = 9,然后通过法则三知道9是不行的,要偏移到12,因为总大小要是最大对齐数的整数倍。
在这里插入图片描述
二、成员包含数组的结构体计算
知道了先前那个基本的结构体对齐列子,再来理解·这个就相对容易一点了。
在这里插入图片描述
加了一个char类型的数组,可以看作有5个char类型的存入内存中,然还要满足结构体总大小为最大对齐数的整数倍
综上结构体的总大小为:1 + 3 + 4 + 1 + 5 + 2 = 16
三、结构体包含结构体的结构体大小
在这里插入图片描述
对于结构体中的结构体,关键的是把对齐数找到,可以看出SS结构体的大小为8,但是对齐数总大小不是按8为倍数的而是按4的的这就说明,结构体的大小在结构体中不会与指定对齐数进行比较,所以就可以把结构体SS看作是一个char和一个int类型。
综上 结构体的总大小为:1 + 3 + 4 +1 + 3 + 4 + 1 + 3(偏移量) = 20
四、结构体中包含联合体的结构体大小
为了让大家了解这个,我们先讲一下联合体的大小计算规则:联合体中最大成员所占内存的大小且必须为最大类型所占字节的最小倍数。
在这里插入图片描述
有了上述的规则和结果,现在我就来讲述一下这个结果得出的由来:
1.联合体a char c数组(可以看作10个char)占10个空间,double占8空间,int占4空间,最大的是double单个占8个空间。

由于联合体大小计算规则是按 最大的 最小倍数 也就是8的最小倍数能装进去char c数组(大小是10 一个8装不下),所以咱就用两个8,16个空间就能装下啦。

2.联合体b char c数组(看作7个char)占7个空间,double占8个空间,int占4个空间,最大的还是double单个占8个空间。

可以看出来double占的空间还是最大的,没有比8大的空间,所以一个8就够用!

综上所述联合体a:8 + 8 = 16 联合体b:8
好了,通过上述单独讲述一下联合体的大小之后,我们再来讲这个,计算结构体中的联合体大小
在这里插入图片描述
联合体中a占10字节,b占8字节,c占8字节。此联合体大小为16字节,
那么结构体中 d占5字节,e占4字节,f占8字节。16+(5+3)+(4+4)+8=40.所以占40个字节。
这就是今天关于结构体的认识了,后面等大家学到数据结构的时候,结构体成员里不仅有我们现在讲到的,还会包含一个结构体指针,这个指针指向下一个结构体,通过这样,就可以形成一个链表结构,有兴趣的同学可以努力把C语言学完,再去学习这个哦。
这里我也举个列子给大家看看。
在这里插入图片描述
这里就实现了一个简单的链表结构,就是通过结构体里包含结构体指针实现的。
今天的分享就到这里了,我也会持续发布作品。衷心祝愿大家能把C语言学好。
时人不识凌云木,直待凌云始道高。加油在这里插入图片描述
!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值