C 语言 · 结构体分析学习
1.什么是结构体?
是由一系列具有相同类型或不同类型的数据构成的数据集合,叫做结构体。
个人觉得结构体就是一个数据类型的扩充、更具有综合性、普遍性、适用性,因为目前阶段的发展,简简单单的数字、字符已经很难满足目前的数据需求,为了满足这个需求,结构体出现了。
2.结构体基本语法
//例1:
struct mail//声明一个名字为mail的结构体,
//结构体中的数据类型分别为字符数组、字符数组、整形、字符数组
{
char name[20];
char sex[5];
int age;
char num[20];
};
struct li_mail//声明一个明为li_mail的结构体,
//结构体中的数据类型分别为 另外一个名为mail结构体、整形
{
mail a;
int count;
};
//以上两个例子说明了结构体的组成可以是基本的数据类型,也可以是一些结构体。
//例2:
struct
{
char name[20];
char sex[5];
int age;
char num[20];
}a,b,c,*p;
//这个结构体没有名字,只能直接在后面跟上定义的结构体变量,
//当然也只能定义一次,后面想再用肯定不行啦,因为你不知道名字的啦
//推荐不要这样用啦,因为可能到时候你定义的这几个a,b,c,以及结构体指针p是全局变量
//使用时可能出问题啦。
//例3 (个人比较推荐的初学者写法)
struct mail
{
char name[20];
char sex[5];
int age;
char num[20];
};
int main ()
{
struct mail a;//定义了一个结构体变量,当然我这里按理来说是要初始化的,省略啦。
struct mail* p = NULL;//定义了一个指向mail 结构体的指针
struct mail arr[20]={0};//定义了一个结构体数组,并全部初始化为‘0’
}
//每次都要写struct可能会觉得很麻烦,其实可以用下类型重名,typedef
typedef struct mail
{
char name[20];
char sex[5];
int age;
char num[20];
}mail; //将struct mail 类型重命名为mail 后面调用时 就不用写struct啦。
3.结构体大小(重点啦,认真看啦)
首先我们都知道int 、float、char、double等基本数据类型都有他的大小,说到底结构体就是一个自定义的类型,它和上面那些基本的数据类型类似,有自己的大小,不过就是是结构体的大小相对来说算起来有点麻烦而已,接下来我会带大家来分析下结构体大小的规则。
3.1内存对齐
在正式跟大家分析结构体大小之前先和大家介绍个内存对齐
3.1.1什么是内存对齐
数据在存储时并不是一直是一个字节一个字节挨着存储的,而是遵循一定的规则来保证访问效率,如果是一个一个存储时、读取时,对cup的效率有一定的影响。详细的建议大家看下又换操作系统的书籍,内存对齐涉及到底层的数据抓取方面的知识。
3.2结构体存储规则
1.结构体第一个类型从第0内存开始存,
2.下一个类型大小必须对齐到一个对齐数的整数倍处,对齐数是在这个类型的大小与开发环境默认对齐数中的小的那个。windos 下默认为4, linux默认为8
3.最后一个类型计算完后 整个结构体的大小为整个结构体中各个类型的最大对齐数的整数倍。
4.如果结构体中嵌套结构体,则嵌套的结构体对齐到该结构体内最大对齐数的整数倍处,最后结构体整体大小仍旧是所有类型中对齐数最大的那个数的整数倍。
//例
struct mail
{
char name[20];//第一个从0开始,下一个还是char 大小为1与默认值4比较,
//1 小就跟着下一个对齐就ok
char sex[5];
int age;
char num[20];
};
//计算该结构体大小
//第一个类型char name[20]; 从0开始存,需要19个字节,接下来是char sex[5]
//因为对齐数为1,小于默认对齐数,则从下一个直接开始存,存5字节,现在为24字节
//接下来是int age;对齐数为4则应该从下个为4的整数倍的地方开始存,
//则从28开始存 存到31,接下来是char num [20];对齐数为1,则紧跟着后面连续存20个
//现在为51字节,但是又要是最大对齐数的整数倍,则就52字节啦。

11万+

被折叠的 条评论
为什么被折叠?



