一、结构体类型创建
1)结构的声明
struct tag
{
member-list;
} variable-list;
eg:描述一个学生
struct Stu
{
char name[20]; //名字
int age; //年龄
char sex[5]; //性别
char id[20]; //学号
}; //此处有分号
2)特殊的声明
匿名结构体类型:在声明的时候省略了结构体标签tag
struct
{
int a;
char b;
float c;
}x;
struct
{
int a;
char b;
float c;
}a[20],*p;
结构体内存对齐
规则:1.第一个成员在与结构体变量偏移量为0的地址处
2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处
对齐数=编译器默认的一个对齐数与该成员大小的较小值
(VS中默认的值为8
(Linux中默认的值为4
3.结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
4.如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
枚举+联合
枚举是一个被命名的整型常数的集合,本质还是整型;
内部成员第一个默认值是0,后边依次+1;
例如
enum A{
a,//默认值是0
b,//1
c,//2
d,//3
e//4
}
enum A{
a=10,//10
b,//11
c=20,//20
d,//21
e//22
}
联合体:
在“联合”中,各成员共享一段内存空间, 一个联合变量的长度等于各成员中最长的长度。共享不是指把多个成员同时装入一个联合变量内, 而是指该联合变量可被赋予任一成员值,但每次只能赋一种值, 赋入新值则冲去旧值。
union number
{ /定义一个联合/
int i;
struct
{ /在联合中定义一个结构/
char first;
char second;
}half;
}num;
num.i=0x4241; /联合成员赋值/
printf("%c%c\n", num.half.first, num.half.second);
num.half.first=‘a’; /联合中结构成员赋值/
num.half.second=‘b’;
printf("%x\n", num.i);
输出结果为:
AB
6261