第十三课
1,结构体定义
结构体类型:不同数据类型的集合;
1,方式:
struct 结构体名
{
数据类型 成员名;
数据类型 成员名;
...
}结构体变量名;
2,使用方法:
·如果是普通类型,使用'.'表示访问
·如果是指针类型,使用'->'表示访问
3,指针型结构体变量的使用:
·结构体指针->成员名;
·(*结构体指针).成员名
3,定义结构体变量
·1,例子:
struct Nn
{
int a;
int b;
};
struct Nn s;
2,使用typedef
例子:
typedef struct Ss
{
int a;
int b;
}n;
2,结构体变量占内存大小
1,使用sizeof运算符获得结构体大小;
2,结构体类型所占的内存字节数不是各成员所占内存的总和
规则:
内存对齐(字节对齐):为了更快的存取数据;
对齐规则:
1,结构体的总大小为结构体最宽基本类型成员大小的整数倍;
2,在对齐时,编译器会自动加上填充字节;
3,结构体总大小包括填充字节;
3,位段
位段:在结构体成员的后面用':'表示位段,后面指定使用多少bit位;【节省内存】
例子:
struct Sa
{
int a:10;
int b:4;
int c:8;
};
注意事项:
1,当结构体里面是同一类型时,合并;
2,不是同一类型时,按最宽的类型进行字节对齐
用处:(求一个数据的二进制输出)
#include<stdio.h>
typedef struct Er
{
unsigned char bit1:1;
unsigned char bit2:1;
unsigned char bit3:1;
unsigned char bit4:1;
unsigned char bit5:1;
unsigned char bit6:1;
unsigned char bit7:1;
unsigned char bit8:1;
}er;
int main()
{
int n = 111111;
er* e = &n;
int len = sizeof(n);
while (len--)
{
printf("%d%d%d%d %d%d%d%d ",
(e + len)->bit8, (e + len)->bit7, (e + len)->bit6, (e + len)->bit5,
(e + len)->bit4, (e + len)->bit3, (e + len)->bit2, (e + len)->bit1);
}
return 0;
}