自定义类型:结构体,位段,枚举,联合

结构体:是一些值得集合,这些值称为成员变量。它们可以是任何不同类型的变量。

struct stu
{
char name[20];
int age;
char sex[5];
};

描述一个学生的结构体声明。
在结构体声明时,还可以不完全声明(省略了标签tag),如:

struct 
{
char name[20];
int age;
char sex[5];
}stu;

结构体的自引用:

struct stu
{
char name[20];
int age;
char sex[5];
struct stu* next;      
};

要想在结构体中自引用,必须在结构体内定义的是结构体指针,否则是错误的。因为在结构体定义的时候,我们必须知道结构体内的成员大小,否则是定义不了的。

sturct B;
struct A
{
int a;
struct B* b;
};
struct B
{
int b;
struct A* a;
};

在上面的代码中,我们在结构体A中有结构体B作为成员变量,所以我们必须在结构体A的前面先声明有结构体B,否则错误。
结构体的初始化,成员变量的赋值:

struct stu
{
char name[20];
int age;
char sex[5];
};

struct stu stu1 = {"zhangsan",18,"man"};  //结构体初始化
struct stu stu2;
strcpy(stu2.name,"lisi");   //成员变量的赋值
stu2.age = 20;

printf("name: %s   age: %d",stu1.name,stu1.age);
printf("name: %s   age: %d",stu2->name,stu2->age);

在结构体中,我们可以在初始化时给结构体整天赋值。
如果结构体已经被定义,我们不可以给结构体整天初始化,只能通过访问它的每一个成员变量给它赋值。
当我们想打印出成员变量时,可以用 ‘ . ’操作符和‘ - >’操作符来进行访问。

结构体的内存对齐:

结构体需要内存对齐:
1,平台的不同,硬件访问内存的要求
2,为了减少访问内存的次数,使用多点内存,使效率提高

结构体内存对齐的规则:
1,结构体第一个成员不需要对齐,但它也有对齐数
2,除了第一个成员,其他的成员都需要对齐到对齐数的整数倍(VS:8 —— Linux: 4)
3,结构体的总大小为最大对齐数的整数倍
4,如果嵌套了结构体,嵌套的结构体对齐到自己最大对齐数的整数倍,结构体的总大小就是整天最大对齐数的整数倍。

struct A
{
double a;
int b;
char c[10];
};

根据上面的内存对齐规则,可以算出结构体在VS环境下的总大小为:24

struct A
{
double a;
int b;
char c[10];
};
struct B
{
int aa;
char cc[4];
struct A a;
};

在结构体B中嵌套了结构体A,可算出结构体B在VS环境下的总大小为:32
这里写图片描述

位段:
位段的成员必须是 char,int ,unsigned int或者是 signed int 类型。

struct  A
{
int a:10;
int b:4;
int c:20;
};

上面的代码就是一个位段类型.它的大小为8。
位段的空间以4个字节(int)或者1个字节(char)的来开辟的。当第二个成员的大小无法容纳于第一位段剩余的位时,需要重新开辟下一个(int)字节。
因为位段涉及很多不确定因素,位段是不跨平台的。

枚举:

enmu Day
{
Mon = 1,
Tues = 2,
Wed = 3,
Thur = 4,
Fri = 5,
Sat = 6,
Sun = 7,
};

上面就是定义了一个枚举类型,可以直接赋初值,如果在定义的时候没有赋初值,默认的从0开始,依次增加1。
使用枚举:增加了代码的可读性和可维护性;防止了命名污染

联合(共同体):是一种特殊的结构体,它的成员共用同一块空间(所以也叫共用体)

这里写图片描述

联合体的大小至少为最大成员的大小,联合体的成员共用同一块内存空间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值