1.结构体类型
我们学过很多类型,如int,char,float,char,double等等,它们只能定义单一变量,但是如果描述一个复杂事物,比如书,人等,就要使用结构体了。
结构体(struct)是一种用户自定义的可用的数据类型,允许存储不同类型的数据项。结构(体)是一些值的集合,这些值称为变量名
2.结构体变量的声明
struct tag//结构体名称
{
member-list;//结构体变量
}variable-list;//变量列表
注意:结构体有{},同时不要忘记{}后面的;
3.结构体的创建和初始化
3.1结构体的创建
结构体的声明了解后,就可以创建结构体了。
比如,描述一个学生
struct Stu
{
char name[20];
int age;
char sex[6];
char ID[15];
};//分号一定不能忘
3.2结构体的初始化
如果想进一步看此学生的各种信息,就要初始化结构体
代码如下:
#include<stdio.h>
struct Stu
{
char name[20];
int age;
char sex[6];
char ID[15];
};//分号一定不能忘
int main()
{
struct Stu s = { "张三",18,"male","23893729" };
return 0;
}
再进一步,可以嵌套定义和初始化
比如
#include<stdio.h>
struct St
{
int a;
double b;
char c;
};
struct Tu
{
struct St s;//嵌套定义
char name[20];
char ID[20];
};
int main()
{
struct Tu t = { {20,8.00,'d'},"zhangsan","374892145" };
return 0;
}
4.结构体成员的访问
有两种访问形式,接下来,我就分别开始介绍。
4.1变量名 . 结构体成员名
拿上面学生的例子来展示
#include<stdio.h>
struct Stu
{
char name[20];
int age;
char sex[6];
char ID[15];
};//分号一定不能忘
int main()
{
struct Stu s = { "张三",18,"male","23893729" };
printf("%s %d %s %s\n", s.name, s.age, s.sex, s.ID);//访问
return 0;
}
4.2结构体指针 -> 成员名
还是拿学生的例子举例
#include<stdio.h>
struct Stu
{
char name[20];
int age;
char sex[6];
char ID[15];
};//分号一定不能忘
int main()
{
struct Stu s = { "张三",18,"male","23893729" };
struct Stu* ptr = &s;
printf("%s %d %s %s\n", ptr->name, ptr->age, ptr->sex, ptr->ID);//访问
return 0;
}
OK,上面的告一段落,下面是重头戏
5.结构体内存对齐
对齐规则
1.结构体的第一个变量对齐到结构体变量起始位置偏移量为0的地址。
2.其他成员变量要对齐到某个数字(对齐数)的整数倍地址处。
对齐数:编译器默认的数与该成员变量的较小值
VS编译器的默认数是8
3.结构体总大小为最大对齐数的整数倍。
4.如果遇到嵌套结构体情况,结构体1嵌套在结构体2中,还是按照上述结果去算即可,把结构体1当做一个变量就可以。
上面的概念比较难懂,那我就画图来解释一下
struct S
{
int a;
char b;
double c;
};
int main()
{
printf("%d\n", sizeof(struct S));
return 0;
}
运行截图 ,大小为16
如果把结构体中的变量换位置,那么结构体的大小就可能不同。
举一个嵌套定义的例子
struct S3
{
double d;
char c;
int i;
};
struct S4
{
char c1;
struct S3 s3;
double d;
};
int main()
{
printf("%d\n", sizeof(struct S4));
return 0;
}
运行结果
over~