前言
在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来检测一下:

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

被折叠的 条评论
为什么被折叠?



