自定义数据类型
struct | union | enum | typedef |
1. struct 结构体
各种数据类型的集合(打包封装)
struct person{
int age;
int height;
}myson;
person是一个新的类型,不是一个变量名,
相当与
struct person{
int age;
int height;
};
struct person myson;
1.2 所占空间的计算:
1.整体空间是占用空间的最大成员(的类型)所占字节数的整数倍。
2.数据对齐原则:内存按结构体成员的先后顺序排列,当排到该成员时,其前面已摆放的空间大小必须是该成员类型大小的整数倍,如果不够补齐,依次向后类推。
例子:
32位,char一个字节,int四个字节,double 8个字节
int main()
{
struct my {
char a;
double b;
int c;
char d;
};
printf("int占%d个字节\n",sizeof(int));
printf("double占%d个字节\n", sizeof(double));
printf("char占%d个字节\n", sizeof(char));
printf("结构体my占%d个字节\n", sizeof(my));
}
具体分析: char a;
1 a占一个字节,结构体第一成员的起始地址是0,也就是被a占据。
2 ddouble b ,8个字节 数据对齐原则:其前面已摆放的空间大小必须是该成员类型大小的整数倍,如果不够补齐,
因为a的空间大小是1,b是8 ,因此,不够补齐,在补7个,现在成为 8+8=16个
3 int c,4个字节,16是4的整数倍,直接加16+4=20
4 char d ,1个字节,20是1的整数倍。20+1=21
整体空间是占用空间的最大成员(的类型)所占字节数的整数倍。
最大成员类型为8字节,比21要大,因此是3*8=24
2.union 共用体
在union中所有的数据成员共用一个空间,同一时间只能存储一个数据成员,所有的数据成员具有相同的起始地址。并且所需空间大小只取决于最大元素的类型, 所以联合体的好处是能节省内存空间。对于一些数据不能再同一时间同时被用到,则可以考虑用union。
3.enum 枚举类型
enum weekday{sun,mon,tue,wed,thu,fri,sat};
定义变量为枚举类型:
enum weekday day;
或者
enum weekday{sun,mon,tue,wed,thu,fri,sat} day;
其中,花括号里为 枚举元素 是常量,不是变量,不能给其赋值,他们是有值的。按顺序的
4.typedef
与#define 挺像的,定义自己习惯的数据类型名称,来替代系统默认的基本类型名称、数组类型名称、指针类型名称与用户自定义的结构型名称、共用型名称、枚举型名称等。