自定义类型

一、结构体

1.1结构的基础知识

结构是一些值的集合,这些值称为成员变量

1.2结构的声明

 

1.3特殊的声明

 在声明结构体的时候可以不完全的声明 

1.4 结构体的自引用 

 结构体的自引用应该使用结构体指针来进行访问,例如以下的代码:

struct Node
{
int data;
struct Node* next;
};

1.5结构体变量的定义和初始化

struct Point
{
int x;
int y;
}p1; //声明类型的同时定义变量p1
struct Point p2; //定义结构体变量p2
//初始化:定义变量的同时赋初值。
struct Point p3 = {x, y};
struct Stu //类型声明
{
char name[15];//名字
int age; //年龄
};
struct Stu s = {"zhangsan", 20};//初始化
struct Node
{
int data;
struct Point p;
struct Node* next;
}n1 = {10, {4,5}, NULL}; //结构体嵌套初始化
struct Node n2 = {20, {5, 6}, NULL};//结构体嵌套初始化

1.6结构体的内存对齐(非常重要)

先看这段代码的运行结果:两个结构体的成员类型和数量相同但是两个结构体的大小却不同

 

 

结构体内存大小计算的规则:

如何计算?
首先得掌握结构体的对齐规则:
1. 第一个成员在与结构体变量偏移量为0的地址处。
2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
VS中默认的值为8
3. 结构体总大小最大对齐数(每个成员变量都有一个对齐数)的整数倍。
 

可以用offsetof()来求每个成员变量相对于结构体起始地址的偏移量
 

 4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整
体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

就例如图中的这个嵌套结构体

        先看 struct S3  的大小:第一个成员是double类型的默认的对齐数是8,double大小也是8,所以它的对齐数就是8,首成员是默认从地址0处就开始对齐的。第二个是char型,对齐数是1对齐到1的整数倍,如图起始地址是位置 8 ,第三个成员是int型,4和8中取较小者即 4 ,对齐到4的整数倍的地址处,最近的应该是地址12处,故整个结构体大小应是最大对齐数8的整数倍应该是 16 

        再来看struct S4的大小:第一个成员是char型,应该对齐0处;第二个成员是结构体,嵌套结构体的对齐原则是对齐到嵌套的结构体的成员里最大的对齐数的整数倍(在这里最大对齐数是double 8 也就是说嵌套结构体的对齐数是它的成员里的最大对齐数,故对齐到地址8,因为S3大小为16所以往后占了16个字节大小;第三个成员是double型对齐到8的整数倍,下一个8的整数倍应该是24,从地址24开始对齐到3结束,至此0 到 31,有32个字节,对于S4来说成员的最大对齐数是8,所以内存大小是8的整数倍,下一个是整数倍是32,故32就是S4的大小

1.7修改默认对齐数

 

二、 位段


 

 

 

 

三、枚举

3.1枚举的定义

enum Day//星期
{
Mon,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};
enum Sex//性别
{
MALE,
FEMALE,
SECRET
};
enum Color//颜色
{
RED,
GREEN,
BLUE
};

 

3.2枚举的优点

四、联合体(共用体)

4.1联合类型的定义

4.2联合的特点

联合的成员共用一块内存空间,这样的一个联合变量的大小,至少是最大成员的大小

4.3联合体的大小

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值