自定义类型有:结构体,枚举,联合
一、结构体
1.声明
struct Stu
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[20];//学号
};
分号不能丢
2.特殊的声明
//匿名结构体类型
struct
{
int a;
char b;
float c;
}x;
struct
{
int a;
char b;
float c;
a[20];
}*p;
此时 p = &x; 是非法的
3.结构体的自引用
struct Node
{
int data;
struct Node* next;
};
自引用应先定义完整的结构体,再进行引用
结构体可以嵌套
4.结构体的内存对齐
1.第一个成员的地址从0开始
2.其他成员要对应到自身大小整数倍的位置,如int 要对应 4或者8
3.结构体总大小要为最大对齐数的整数倍,如结构体大小计算为18,最大对齐数为int,4个字节,那么结构体的大小为20
4.嵌套的结构体对齐数为最大对齐数的整数倍,包含结构体的结构体对齐数是所有对齐数中最大的,结构体的整体大小也是其整数倍
5.内存对齐访问更快,是拿空间换时间
6.设计结构体时,应将对齐数小的放到前面(所占字节小),可以节省空间
7.修改默认对齐数
#pragma pack(8) //设置默认对齐数为8
struct S1
{
char c1;
int i;
char c2;
};
#pragma pack() //取消设置的默认对齐数,还原为默认
5.结构体传参
void print1(struct S s)
void print2(struct S* ps)
有两种传参方式,最好选择print2函数,要传结构体的地址,选择print1函数时,传参时会压栈,导致系统性能下降
二、位段
struct S
{
char a:3;
char b:4;
char c:5;
char d:4;
};
注意此处冒号,冒号后的数字即该变量所占空间的大小(比特位)
不建议跨平台使用
三、枚举
enum Color//颜色
{
RED,
GREEN,
BLUE
};
enum Color为枚举类型,{ }内为枚举变量,这些变量都是由值的,从0开始,依次递增1
也可以对它们进行赋值,赋值一个变量后,其后边的变量依次递增1
四、联合体(共用体)
联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小
(因为联 合至少得有能力保存最大的那个成员)
联合的大小至少是最大成员的大小。
当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
如
union Un2
{
short c[7];
int i;
};