结构和联合
1.结构基础知识
1.1 结构声明
通过例子说明结构声明的方式。
(1)
struct { int a; char b; float c; }x;
这个声明创建了一个名叫x的变量,它包含三个成员。后面的x是变量列表。
(2)
struct { int a; char b; float c; }y[20], *z;
这个声明创建了包含20个结构的数组y和指向结构的指针z。
警告:虽然这两个声明的结构的成员列表完全相同,但是编译器会把他们当做两种不同的类型。所以z = &x是非法的。
可以加入标签字段为成员列表提供一个名字。
(3)
struct SIMPLE { int a; char b; float c; }
这个声明把标签SIMPLE和成员列表联系在一起。该声明没有提供变量列表,所以它并未创建任何变量。使用标签创建变量如下:
struct SIMPLE x; struct SIMPLE y[20], *z;
声明结构一种良好技巧是使用typedef创建一种新的类型,如:
typedef struct { int a; char b; float c; }Simple;
这个技巧和声明一个结构标签的效果几乎相同。区别在于Simple现在是个类型名而不是个结构标签,所以后续的声明可能是下面的样子:
Simple x; Simple y[20], *z;
提示:如果想在多个源文件中使用同一种类型的结构,应该把标签声明或typedef形式的声明放在一个头文件中。当源文件需要这个声明时可以使用#include指令把该头文件包含进来。
1.2 结构成员的访问
直接访问方式:结构变量的成员是通过点操作符(.)访问。点操作符的左操作数是结构变量的名字。下标引用和点操作符具有相同的优先级,结合性都是从左向右。
间接访问方式:通过->操作符。->操作符的左操作数是一个指向结构的指针。
1.3 结构的自引用
在结构内部包含自身(非指针)是非法的,类似永远不会终止的递归程序。
在结构体内部包含自身的指针是合法的,因为编译器在结构的长度确定之前就已经知道指针的长度。
2.联合基础知识
联合的声明类似结构,但行为与结构不同。联合的所有成员引用的是内存中的相同位置。当你想在不同的时刻把不同的东西存储于同一个位置时,可以使用联合。联合声明例子如下:
union { float f; int i; }fi; fi.f = 3.14159; printf("%d\n", fi.i);
联合的长度就是它最长成员的长度。