学习了自定义类型,而以下是我学习了自定义类型后的总结,如有不足望大家指正。
一,什么是结构体
我先介绍结构体。我在介绍结构体之前先铺垫一些知识,我们要了解结构是什么,结构是一些值的集合,这些值称为成员变量。结构体的每个成员可以是不同类型的变量。以下是一个简单的结构体
学过结构体的小伙伴知道以上写的是特殊结构体,它省略了结构体标签tag,这种结构声明称为不完全的声明。以下是结构体声明
知道了结构体声明,接下来是结构体变量的定义,其实很简单,请看
结构体的定义包括定义变量,赋值的操作。细心的同学会发现,第三个结构体不一样,它其实是就结构体自引用,自己调用自己的过程。
二,结构体内存对齐***
计算结构体的大小。
如何计算结构体的大小呢?这牵扯到结构体内存对齐
以下是实现过程
这是一道典型的结构体内存对齐的题。
我首先开辟一处空间
按顺序,先填int 型对齐数,再填short型对齐数,最后补齐
不过我有个疑惑,为什么要内存对齐呢?直接访问内存不好吗?
有两点原因,一,移植原因,不是所有的硬件平台都能访问任意地址上的任意数据的,某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
二,性能原因,内存对齐对数据做了对齐,方便对内存进行访问
三,位段
什么是位段
位段与结构类似。有两个不同:位段的成员必须是int,unsianed int 或 signed int。位段的成员后面有一个冒号和一个数字。
特点:位段的成员是:int, unsigned int, signed int或者是char。位段在空间上开辟空间,有四字节,一字节。位段有很多不确定因素,是不跨平台的。
四:枚举
什么是枚举
一一列举,比如一月有三十一天,可以一一列举。
性别,男,女,保密,必然可以一一列举。枚举的例子:
四(2):我们知道#define定义常量,那#define和枚举有啥区别呢?
通过代码运行,不难看出,#define在宏定义时定义的值直接赋值给main函数内部的变量,而宏定义赋值是不可以修改的。枚举中可以任意修改,这样我们在调试时发现问题,是可以修改的。
五,联合体
联合体是成员共用一块内存空间,这样一个联合变量的大小,至少是最大成员的大小
联合体的大小计算。
依据内存对齐规则
这里着重强调,对齐数要对齐到最大数的整数倍,因为内存中要放下最大数