结构基础知识
C提供了两种类型的聚合数据类型,数组和结构。数组是相同类型的元素的集合,但每个结构的成员可以具有不同的类型;
数组元素通过下标访问,每个结构成员都是通过成员名字访问的;
和数组名不同,当一个结构变量在表达式中使用时,它并不被替换成一个指针;
相同类型的结构体相互之间可以进行赋值;
1、结构声明
结构成员
机构里的成员可以支持任意类型。
结构成员的访问当变量为结构体本身时,为直接访问用变量名.加成员名;
当变量为机构体的指针时,为简介访问,方式为变量名->成员名。
结构的自引用
结构的自引用,不是在结构体里还包含结构体本身类型的成员变量(这个递归定义是不可以的),而是在结构体里包含其结构体本身的指针变量。
不完整的声明
结构的初始化
结构的初始化和多维数组带花括号的初始化很相似,一个位于一对花括号内部,由逗号分隔的初始值列表可用于结构各个成员的初始化。如果初始列表的值不够,剩余的结构成员将使用缺省值进行初始化。
struct INIT_EX{
int a;
short b[10];
Simple c;
}={
10,
{1,2,3,4,5},
(25,'x',1.9}
};
结构、指针和成员
相互之间的访问方式就不详细说了
结构的存储分配
其中存在对齐要求。为了节省空间,我们可以通过对机构成员重排,但这也许会减少程序的可读性。空间和可读性需要我们自己平衡(可读性差的时候只能通过加注释来解决了)。
作为函数参数的结构
结构体变量是一个标量,我们可以直接使用按值传递传递这个变量。但如果一个结构体过大,我们就必须把相应的字节全部复制到堆栈中,以后再丢弃。这样实在是没必要,因此我们一般传递结构的指针;
向函数传递指针的缺陷在于函数现在可以对调用程序的结构变量进行修改。如果我们不希望如此,可以在函数中使用const关键字修饰。
位段
位段可以实现的功能都可以通过移位和屏蔽来实现,只不过位段使用起来更明了些,但位段可移植性很差。
联合
在一个成员长度不同的联合里,分配给联合的内存数量取决于它的最长成员的长度。
联合的初始化