一、什么是结构体?
C语言提供了两种类型的聚合数据类型,数组和结构。数组是相同元素的集合,它的每个元素是通过下标引用或指针间接访问来选择的。结构也是一些值得集合,这些值称为成员,但每一个结构的成员可能具有不同的类型。
二、结构体相关知识
1.结构声明
在结构声明时,必须列出结构所包含的所有成员,每个成员有自己的类型和名字,且各个成员的类型可以相同也可以不同。如:
typedef struct { int a; char b[6]; }example1;
2.结构成员的访问
2.1 直接访问
可以使用(.)操作符直接访问结构成员。如:
example1 exam1; //声明一个结构体变量 exam1.a; //访问结构体成员a exam1.b[0]; //访问结构成员b[0]
2.2 间接访问
对于一个指向指针类型的结构体,可以使用(->)间接访问结构成员,如
typedef struct { int c; char d; }example2; example2 *exam2; //声明一个指向结构类型的指针变量 exam2->c; //间接访问结构成员c
3、结构的存储分配
对于结构的存储,编译器会按照结构成员列表的顺序一个接一个地给每个成员分配内存。结构在内存中的存储,需要考虑边界对齐的情况。如下面这个结构。
typedef struct { char a; int b; char c; }example3;
在我的编译器上,int占4个字节,char占1个字节。则结构体example3在内存中的存储如下图所示:
从上图可以看出,结构example3在内存中占12个字节的存储空间。为了避免内存空间的浪费,我们可以调整结构成员的顺序,如:
typedef struct { int b; char a; char c; }example4;
则结构example4在内存中的存储如下图所示:
从上图可以看出,结构example4在内存中占8个字节的存储空间,相比结构example3节省了33%的空间。
如果要得到一个结构的整体长度,可以使用sizeof操作符,使用sizeof求得的结构长度,包括因边界对齐而跳过的那些字节。如果要确定某个成员的实际位置,必须要考虑边界对齐的因素,这时,可以使用offsetof(定义于stddef.h)。格式如下:
offsetof(type,member)
type是结构的类型,member是结构的成员。表达式的结果是一个size_t值,表示这个指定成员开始存储的位置距离结构开始存储的位置偏移几个字节。如:
offsetof(example4,a)
的返回值为4。