自定义类型:结构体

本文介绍了C语言中结构体的基本概念,包括结构体的声明方式、变量的创建与初始化,以及结构体内存的对齐规则,特别提到了匿名结构体和VS编译器的对齐行为。

前言

在C语言中有很多基本数据类型,如:  int, float ,double,char等等.  但是当我们要描述相对较复杂的事物时,如 "书本"  就十分不方便.,因为 书本有它的名字,作者,价格等等各种属性,这些属性可能会实用不同的数据类型,而用单个类型就不能准确地描述它.  这时,就可以使用我们的自定义类型:结构体

1 结构体类型的声明

1.1 一般声明

直接上例子:

struct book
{

	char name[20];
	int price;
	char auother[20];

};

上面的一个代码块就是结构体的声明, struct是结构体的关键字,后面紧跟着的是结构体类型名book,

一般定义在全局的位置.  而结构体的成员有三个,可以是不同类型的,是用来表示这个类型的属性.

OK,声明讲完了,我们来聊聊结构体类型变量的创建与初始化.

1.2 结构体变量的创建和初始化

结构体的声明讲完了,我们来讲讲它的使用.

1.2 结构体变量的使用

这里就要用到两个操作符(.操作符和->操作符 )

点操作符是针对结构体变量的,而箭头操作符是针对结构体指针的

上例子:

通过点操作符就可以对结构体变量里的成员进行打印,赋值等操作.

结构体指针也可以用箭头操作符做到同样的事.结构体指针当然可以先解引用得到结构体变量,在用点操作符进行操作,但是这未免有些麻烦,所以箭头操作符就出来了.

上例子:

1.3 结构体的特殊声明

结构体有一种特殊的声明方式,叫做匿名结构体类型

就是在声明的时候只写结构体关键字,不写类型名,而在结尾处,定义结构体变量

而匿名结构体类型只能定义这一次变量,以后都不可以定义了.

上例子:

但是你会发现.当你再次定义变量时会报错,错误结果如下:

不过这也十分合理,因为都没有类型名,那么还怎么定义?

2 结构体内存对齐

2.1 对齐规则

其中第二条中的默认对齐数由编译器决定,在VS中的默认对齐数就是8

我们就以VS为例举几个例子

我们一步一步来看:第一个元素在0偏移量处,本身是1个字节, 所以就填充一个单位字节,

int类型数据的大小是4个字节,与默认对齐数相比,对齐数是4,所以要填充在4的整数倍处,所以偏移量为1~3的内存就被浪费了,所以从4处开始填充,一共填充4个字节,

char类型数据大小是一个字节,与默认对齐数相比,对齐数是1,所以只需要往下再填充一个字节即可.

0~8 一共是九个字节,但还有最后一点,就是整体大小要是最大对齐数的整数倍.

最大对齐数是4,所以至少要是12个字节,才符合要求,所依最终结果是12个字节

我们通过Vs来检测一下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值