指针数组 int *p[5]; 每一个元素就是一个指针,多用于二级指针
数组指针 int (*p)[5]; 每个元素地址表示就是一个一维数组的首地址。多用于二维数组
结构体总大小 % 最大的位置偏移 == 0,如果不为0则补齐,struct内存对齐与取消内存对齐:
struct A{
int a; //4 0 % 4 = 0
char b; //1 4 % 1 =0
double c; //8 5 % 8 =5 +3 4+1+8+3 = 16
short d; //2 16 % 2 =0 =18
18 % 4 =2 +2 = 20内存对齐
}; //结构体的总大小 % 最大的位置偏移 == 0structB{
int a; //4
char b; //1
double c; //8
short d; //2
}__attribute__((__packed__)); //取消内存对齐 = 15
共用体则是 最大的成员对应的内存
结构体类型的变量是由多个单一数据类型的变量组合在一起的,在使用的时候, 可以对结构体内部的单一数据类型变量单独来访问。
数组的成员全部是同类型,而结构体变量的成员可以是不同数据类型
1、结构体使用struct关键字来定义,共用体使用union关键字来定义
2、结构体的每个成员都有单独的内存空间,而共用体的所有成员共用同一块内存(最大的成员对应的内存)
3、共用体变量与结构体变量访问成员的方法是一样
1、 #define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错。
2、typedef是在编译时处理的。它在自己的作用域内给一个已经存在的类型一个别名,但是You cannot use the typedef specifier inside a function definition。
枚举是一中类型,可以用来定义变量,可以包含多个枚举成员,而宏是替换,没有类型,也没有多个成员。
强调:enum;
1、枚举成员的每一个成员都是整数
2、分隔符:为逗号‘,’
3、可以直接赋值:struct和union都不行。
4、枚举的成员直接访问