结构体类型创建
定义结构体一般的形式为:
struct 结构体类型名
{
成员列表
}(s1);
struct people
{
char name[20];
int age;
}(s1);
struct是关键字, 后边加你设置的这个结构体的名字。
s1是设置全局变量。(尽量少设置全局变量)
结构体初始化
可以在声明时直接在后边进按顺序行赋值。
eg:
struct people a={"张三",18};
也可以定义之后逐个赋值
eg:
struct people a;
a.name="张三";
a.age=18;
结构体内存对齐
- 结构体变量中成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍) ,是指结构体自身成员大小和默认偏移量的较小值。默认偏移量在vs上是8,在linux上是4.
- 结构体大小必须是最大成员大小的整数倍。
eg:
struct test_1
{
int i;
char a;
};
test_1的大小为8:
首先i是第一个成员,没有偏移量。占4个字节
a的偏移量是1。放在第5个字节
总大小为5字节,又因为必须是最大成员大小的整数倍,所以补3个字节,得到8字节。
struct test_2
{
char a;
int i;
char b;
};
test_2的大小为12:
首先a为第一个成员,没有偏移量。占1个字节。
i是第二个成员,偏移量为4 。给a补3个字节。i从第5个字节存储,占4个字节。共8字节。
b的偏移量为1,放在第9个字节上。
总大小为9字节,又因为要补到4的倍数,所以为12字节。
位段,位段计算大小
位段:C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或称“位域”( bit field) 。利用位段能够用较少的位数存储数据。
char 是特殊的int型。
eg:
struct bitfield
{
char a:2;
int b:4;
};
- 位段成员的类型必须指定为unsigned或int类型。
- 一个位段必须存储在同一存储单元中,不能跨两个单元。如果第一个单元空间不能容纳下一个位段,则该空间不用,而从下一个单元起存放该位段。
- 可以定义无名位段。
- 位段的长度不能大于存储单元的长度,也不能定义位段数组。
- 位段可以在数值表达式中引用,它会被系统自动地转换成整型数。
- 位段定义的第一个位段长度不能为0。
- 想让下一个位段从下一个存储单元开始存放。可以使用长度为0的位段。
枚举+联合
枚举
如果枚举没有初始化,即省掉"=整型常数"时, 则从第一个标识符开始,顺次赋给标识符0, 1, 2, …。但当枚举中的某个成员赋值后,其后的成员按依次加1的规则确定其值。
enum 枚举名{
标识符[=整型常数],
标识符[=整型常数],
…
标识符[=整型常数]
} 枚举变量;
- 枚举值是常量,不是变量。不能在程序中用赋值语句再对它赋值。
- 枚举元素本身由系统定义了一个表示序号的数值,从0 开始顺序定义为0,1,2…。
联合体
在进行某些算法的C语言编程的时候,需要使几种不同类型的变量存放到同一段内存单元中。也就是使用覆盖技术,几个变量互相覆盖。这种几个不同的变量共同占用一段内存的结构,在C语言中,被称作“共用体”类型结构,简称共用体,也叫联合体。
union 联合名
{
成员表
}(s1);
s1是设置全局变量。(尽量少设置全局变量)
联合体的内存大小也必须是最大成员大小的整数倍。
union test
{
int i;
char a[5];
};
a的字节为5大于i的字节,总字节为5。
又因为要是最多成员的整数倍,所以再补3个字节,为8字节。