1.结构体简介
之前我们学过基础的几种数据类型但是大多情况下我们需要把多个信息联系到一起,那么结构体正是用来解决这个问题,它可以有效的定义一个变量来包含多个信息。
2.结构体使用
#include <stdio.h>
int main(){
//定义结构体stu包含以下变量
struct stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在小组
float score; //成绩
} ;
struct stu stu1;//定义一个结构体变量
//给结构体成员赋值
stu1.name = "yang";
stu1.num = 15;
stu1.age = 20;
stu1.group = 'c';
stu1.score = 120;
//打印结构体成员的值
printf("%s的学号是%d,年龄是%d,在%c组,今年的成绩是%.1f!\n", stu1.name, stu1.num, stu1.age, stu1.group, stu1.score);
return 0;
}
//运行结果:yang的学号是15,年龄是20,在c组,今年的成绩是120.0!
3.结构体的大小与对齐方式
之前我们了解过单个变量所占内存情况,猜想以下这个结构体占多少字节内存
#include <stdio.h>
int main(){
struct stu{
char group; //所在小组
int num; //学号
int age; //年龄
char name; //姓名
} ;
struct stu stu1;
//读取结构体成员的值
printf("结构体所占内存%d字节", sizeof(stu1));
return 0;
}
运行结果为结构体所占内存16字节
//按照之前所说应该是10才对为什么会是16呢
接下来我们就要说下结构体对齐的问题,这是工作中常见的毕竟单片机的资源较少能节约便节约点。
结构体对齐数 为编译器默认的一个对齐数。每个特定平台上编译器都有自己的默认的对齐系数,一般32位平台默认四字节对齐,64位平台默认为八字节对齐。
所以内存中这个结构体group和name都被当做4个字节来处理。
struct stu{
char group; //所在小组
char name; //姓名
int num; //学号
int age; //年
} ;
而这样定义则占12个字节,因为前两个大小为2字节,系统默认补齐4字节结果就是4+4+4=12
那有没有让结构体根据实际所需来对齐呢?
#pragma pack ()出现了通过预处理()填几便是几字节对齐
#include <stdio.h>
int main(){
#pragma pack (1)
struct stu{
char group; //所在小组
int num; //学号
int age; //年龄
char name; //姓名
} ;
struct stu stu1;
//读取结构体成员的值
printf("结构体所占内存%d字节", sizeof(stu1));
return 0;
}
//这样便是一字节对齐结果就是10
4.总结结构体
结构体的定义,使用很简单,但是结构体对齐一定常记心中。结构体指针会放到指针的文章里讲