结构体简介
结构体是一个框架,我们可以在里面加入不同的类来构成不同的结构体,可以根据自我需求来自行定义
结构体使用方法
这是定义一个结构体的基本语法
struct后加上定义名称
以及中括号和分号
构成一个结构体的基本框架
而像这样在结构体中加入不同的类型使得每一个结构体拥有不同的属性
而我们将这些基本类型称之为结构体元素
结构体的调用
如图,即可完成结构体的简单调用
需要注意的是
此时的struct AA 与int a 中的int作用相似
而aa与int a中的a作用相似
而我们在调用aa中的单个数据时可以在后面打" . ",调用单个结构体成员中封装的数据
所以struct 的作用可以理解为创造了一种新的变量,只不过这种变量拥有多个属性
这在封装一组一组拥有多个属性的数据中好用
结构体的使用技巧
不同的声明方法
我们也可以通过在结构体尾部直接初始化变量的方法来对结构体变量赋值
我们在主函数也可通过变量名.结构体成员的方式来改变结构体变量中的数据
结构体的别名
如果在要使用结构体的时候
我们每次都必须要打struct 加结构体名称
这就非常麻烦
此时我们就可以使用typedef为结构体创造一个别名
这个别名打在结尾的大括号和分号之间
等我们要再创造一个新的结构体变量时就可以直接使用别名再加上变量名
此时的typfede就相当于给struct和结构体名称两者加到一起起了一个别名
结构体的储存方法
在结构体的储存中
遵循的原则为将结构体中的最大结构体成员作为一个存储单位
比如在这个例子中,我们的成员有int, char,short
这三个成员的存储大小分别为4,1,2(字节)
但是
我们将其sizeof出来后大小却是8字节
这就是因为我们之中最大的存储单位为4字节
所以尽管这三个成员只有7字节的大小
却要用8个字节来存储
而在局部储存之中
也采用是这个原则
在这8个字节中的后四个字节
存储了char和short
但他们并不是紧挨这的
而是以short为最小存储单元
所以存储在电脑中的格式为
我们可以通过再加一个char来验证
出现了12
这是因为如上的存储方式导致局部没有空间再去存储char d
所以又开辟新的四个字节空间
有关结构体的有趣发现以及疑问
在对结构体存储方式进行探索的时候
我意外发现
在结构体中字符数组的长度定义可以为0
并且在计算字节时大小为1
所以就出现了一个有趣的现象
一个长度为0的字符数组所占的空间为1
在查询相关资料后
发现我意外编写了一个柔性数组
这个数组必须在结构体的最后一位才能生效
在网上的资料中
我例子中的char d 的存储空间会紧跟这上一个结构体成员
但是在我的测试中不知道为什么会指向NULL,这也是我现存的疑问
char[0]的知识小结
char[0]在一些时候作为指针来使用,但是指向地址有时并不为NULL,而是我们在存储时所空出来的单元,这时我们就需要通过偏移来指向目标,具体过程级原理可以看宇龍_的char[0]不是你想用想用就能用,直接搜就能搜到
而且char[0]还作为柔性指针的一种来用malloc分配空间,实现对空间的高效利用,避免了多次free对时间的浪费
!!!!char[0]一定要在C99及以上的编译器上去运行,否则会报错
这是因为C语言在C99标准才将char[0]作为非标准扩展引入