一、结构体基础知识
1、 结构体的声明和创建
(1).下面这个声明创建了一个名叫x的变量,它包含三个成员:一个整数、一个字符和一个浮点数。
struct {
int a;
char b;
float c;
} x;
(2).这个声明创建了y和z。y是一个数组,它包含了20个结构。z是一个指针,它指向这个类型的结构。
struct {
int a;
char b;
float c;
} y[20] , *z;
(3).这个声明把标签SIMPLE和这个成员列表联系在一起。该声明并没有提供变量列表,所以它并未创建任何变量。
struct SIMPLE {
int a;
char b;
float c;
};
这些声明使用标签来创建变量。
struct SIMPLE x;
struct SIMPLE y[20],*z;
(4).这个和声明一个结构标签的效果几乎相同。区别在于Simple现在是个类型名而不是个结构标签。
typedef struct {
int a;
char b;
float c;
} Simple;
后续的声明可能像下面这个样子。
Simple x;
Simple y[20],*z;
2、结构体成员
可以在一个结构体外部声明的任何变量都可以作为结构的成员,尤其是,结构成员可以是标量、数组、指针甚至是其他结构。
3、结构体成员的直接访问
结构体变量的成员是通过点操作符(.)访问的。点操作符接受两个操作数,左操作数就是结构体变量的名字,有操作数就是需要访问的成员的名字。这个表达式的结果就是指定的成员。点操作符的结合性是从左往右
。
4.结构体成员的间接访问
使用箭头操作符->
,箭头操作符接受两个操作数,但左操作数必须是一个指向结构体的指针,右操作数选择一个指定的结构体成员。
5.结构体的自引用
struct SELF_REF1 {
int a;
struct SELF_REF1 b;
int c;
};
这种类型的自引用是非法的
,因为成员b是另一个完整的结构体,其内部还将包含它自己的成员b。这第2个成员又是另一个完整的结构体,它还将包括它自己的成员b。这样重复下去永无止境。
struct SELF_REF2{
int a;
struct SELF_REF2 *b;
int c;
};
这个声明和前面那个声明的区别在于b现在是一个指针而不是结构体。编译器在结构体的长度确定之前就已经知道指针的长度,所以这种类型的自引用是合法的。
6、不完整的声明
如果咩个结构体都引用了其他结构的标签,哪个结构体应该首先声明呢?
使用不完整声明
7、结构体的初始化
一个位于一对花括号内部、由逗号分隔的初始值列表可用于结构体各个成员的初始化,这些值根据结构成员列表的顺序写出。