目录
一、结构体
1.结构体的声明
struct point
{
int x;
int y;
};//分号不要忘
struct Stu//类型声明
{
char name[20];
int age;
char sex[5];
}S1,S2,S3;//变量列表
int main()
{
struct Stu S4;//定义结构体变量
struct Stu S5={"xiaoming",15,"man"};//结构体变量的初始化
return 0;
}
2.结构体变量的定义和初始化
- 初始化:定义变量的同时赋值。
- 变量列表中的S1,S2,S3是全局变量。 S4,S5是局部变量。
- struct Stu 才是结构体类型,不能随意省略struct。
什么时候可以省略struct?
typedef struct Stu
{
char name[20];
int age;
char sex[5];
}Stu; //【*】这里不能定义变量了,只能写重命名的名字
int main()
{
Stu S6;
return 0;
}
strcuct Stu
{
char name[20];
int age;
char sex[5];
}S1,S2,S3;
typedef struct Stu Stu;//【*】
int main()
{
Stu S6;
return 0;
}
3.结构体成员的访问
1.通过结构体变量访问成员使用.操作符
struct Stu s;
strcpy(s.name,"xiaoming");
s.age=15;
2.通过结构体指针访问成员变量
struct Stu s;
struct Stu s={"xiaoming",15,man};
struct Stu* ps=&s;
printf("%s %d %s\n",*ps.name,*ps.age,*ps.sex);
printf("%s %d %s\n",ps->name,ps->age,ps->sex);
4.结构体传参
可以传整个结构体,也可以传结构体地址。
为了更省空间建议传地址。
5.结构体内存对齐(计算结构体所占内存大小)
- 第一个成员放在偏移量为0的地址处。
- 后面的成员放在偏移量为对齐数的整数倍的地址处。 对齐数:编译器 默认对齐数 和 该成员大小 两者间较小的做对齐数。 VS默认对齐数为8,Linux环境没有默认对齐数,成员自身大小就是对齐数。
- 结构体总大小为所有成员对齐数中最大对齐数的整数倍。
- 结构体中嵌套结构体,嵌套的结构体放在自己最大对齐数的整数倍的地址上。结构体的总大小为所有对齐数中最大对齐数的整数倍(嵌套的结构体的对齐数是自己所有对齐数中最大的对齐数)。
- 修改默认对齐数:
- #pragma pack(4);//将默认对齐数改为4
- #pragma pack(); //取消修改,恢复默认对齐数
- 在写结构体的时候把空间较小的成员集中在一起。这样能节省一些空间。
计算结构体大小:
1.分析每个成员对齐数
2.画画图
3.分析总空间大小,找最大对齐数