前言
关于结构体,我之前也介绍了下,只不过太笼统的概念,(学习笔记——共用体和结构体的区别以及共用体的覆盖问题),现在整理详细的计算方法。
结构体的赋值方式
1.初始化
Struct st{
char a;
int b;
}x={
‘A’, 1 };
2.定义变量后按字段赋值
Struct st{
char a;
int b;
};
Struct st x;
x.a = ‘A’;
x.b = 1;
3.结构体变量的赋值
Struct st {
char a;
int b;
};
Struct st x,y;
x.a= ‘A’;
x.b=1;
y=x;
结构体位域
位域类型: char, short,int 可带上(signed或者unsigned)
位域的定义:
struct st{
unsigned char a:7; //字段a占用一个字节的 7bit(位)
unsigned char b:2; //字段b占用一个字节的 2ibt(位)
unsigned char c:7;
}s1;
位域的好处:
①并不需要完整的字节,节省存储空间,处理简单;
②方便利用位域把一个变量按位域分解;
但是不利于程序的移植!!
计算一个结构体大小sizeof(struct s1)
1.结构体偏移量的概念:
结构体中的偏移量指的是一个成员的实际地址和结构体首地址之间的距离。
2.结构体大小的计算方法:
结构体会涉及到字节对齐,(目的是为了让计算机快速读取,用空间交换速度),即最后一个成员的大小+最后一个成员的偏移量+末尾的填充节数。
3.结构体内偏移规则
1、将上面的类型字节大小凑数,成为下面类型字节的倍数。
2、结构体变量的每一个类型字节都可以被其中最大类型字节整除。
3、结构体的总大小是最大类型的整数倍。
4、最大类型是单个最大类型,不是在调用结构的总大小。
struct function
{
int a;//4
char b;//1
};//总大小8
struct test
{
float x;//4
struct function func1;//调用结构8
};//总大小12 单个最大类型为4
练练手吧,看看这个例子。
Struct s1{
成员的大小 成员的偏移量
int a; 4 0
char b; 1 4
int c; 4 5+3(填充字节)
long d; 8 12+4(填充字节)
char e; 1 24
}
Sizeof(s1)=24+1+7(填充字节)
4.结构体成员数组大小
①
Struct st {
int a;
int b;
char c[0];
}st_t;
sizeof(st_t) = 8
②
Struct book {
char name[5];
float price;
}book[2];
Sizeof( book ) = 12;
Sizeof (book[2]) = 24;
第一步:结构体成员占字节数族大的元素为 sizeof ( float ) = 4;则用4 来分配其他成员;
第二步:数组超过四个字节,换行继续,剩下是哪个字节不够float型数据使用,则换行。
总结
一. 结构体成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍)
二. 结构体大小必须是所有成员大小的整数倍(数组和结构体除外)。