结构体、枚举、联合(day14)

一个存储区的地址必须是它自身大小的整数倍
    (double类型存储区的地址只需要是4的
    整数倍)
这个规则叫数据对齐
结构体里面的子存储区通常也需要遵守数据
    对齐的规则
数据对齐会造成结构体内部子存储区之间
    有空隙

结构体存储区的大小必须是它所包含的基本类型
    存储区中占地最大类型存储区大小的整数倍
    (如果这个基本类型是double类型则结构体
     存储区的大小只需要是4的整数倍)
这个规则叫数据补齐
数据补齐可能在结构体最后增加一些浪费的
    字节

枚举有可以用来创建新的类型
枚举类型存储区就是整数类型存储区,枚举
   类型存储区里应该只能存放有限的几个整数
枚举类型也需要先声明然后才能使用,声明
    的时候需要使用enum关键字
声明枚举类型的时候需要提供一组名称,计算机
    为每个名称分配一个对应的整数,枚举
    类型存储区里只能存放这些整数
不同枚举类型所能记录的整数范围不同
计算机把从0开始连续的非负数分配给枚举类型
    里的名称
可以在声明枚举类型的时候指定为某个名称
    分配的整数,这个名称后面的名称对应的
     整数也会发生变化

联合也可以用来创建新的数据类型
联合也需要先声明然后再使用,声明联合的时候
    需要使用union关键字
联合成员变量所占的存储区是互相重叠的
联合所有成员变量的地址都是一样的
联合存储区可以当作多种不同类型的存储区
    使用,每个成员变量代表了一种可能的
    类型
联合存储区的大小就是最大成员变量的大小

用来记录普通变量地址的指针叫做一级指针
二级指针可以记录一级指针的地址,通过它
    可以找到捆绑的一级指针
声明二级指针时需要在指针变量名称前加**

二级指针变量名称前加**可以表示捆绑
    的普通变量存储区
二级指针变量名称前加*可以表示捆绑
    的一级指针存储区

二级指针可以代表指针数组但是不能代表
    二维数组

无类型指针有可能记录一级指针的地址,这个
    时候必须把这个指针强制类型转换二级
    指针然后再使用

二级指针通常作为形式参数使用,使用二级
    指针形式参数可以让被调用函数向调用
    函数传递一个地址数据

C语言里函数也有地址
函数名称可以用来表示函数的地址
函数指针可以用来记录函数的地址
函数指针也需要先声明然后再使用
函数指针的声明可以根据函数声明变化得到

函数指针也分类型,不同格式的函数适合
   与不同类型的函数指针捆绑
函数指针可以用来调用函数

函数指针可以作为形式参数使用
会作为实际参数使用的函数叫回调函数

可以在程序运行的时候临时决定需要分配多少
   存储区
这种分配内存的方法叫动态内存分配
为了管理动态分配内存需要使用一组标准函数
为了使用这些标准函数需要包含stdlib.h头文件

malloc函数可以动态分配一组连续的字节
这个函数需要一个整数类型的参数表示希望分配
   的字节个数
它的返回值表示分配好的第一个字节的地址
如果失败则返回值是NULL
函数的返回值记录在一个无类型指针里,必须
    首先强制类型转换成有类型指针然后才能
    使用

动态分配内存使用完以后必须还给计算机,否则
    会造成内存泄漏问题
free函数可以用来释放动态分配内存
这个函数需要分配好的第一个字节的地址作为
    参数
一起分配的内存必须一起释放
如果用指针做参数调用free函数则函数结束后
    指针成为野指针,必须恢复成空指针
原文地址:https://www.cnblogs.com/Kernel001/p/7735187.html