3个重要技巧:
结构声明是描述结构如何组合的主要办法。结构声明叫做模板,例如:
struct book {
char title[41];
char author[31];
float value;
};
struct book library; //把library声明为一个使用book结构设计的结构变量
结构声明可以放在任何函数的外面,也可以放在一个函数定义内部。
结构有两个意思:结构设计和结构变量。
struct book library; //把library声明为一个使用book结构设计的结构变量
看到这条指令,编译器会创建一个变量 library。编译器使用 book 模板为该变量分配空间,这些存储空间是以一个名字 library 被结合在一起的。
在结构变量的声明中,struct book 所起的作用与 int 或 float 在变量声明中的作用一样,即 struct book 成为了一种新的类型。
声明结构的过程和定义结构变量的过程可以合并为一步:
struct book {
char title[41];
char author[31];
float value;
} library; //在定义之后跟变量名
要初始化一个结构变量,可以使用与初始化数组类似的方法:使用一个花括号括起来的、逗号分隔的初始化项目列表进行初始化
struct book library = {
"The Pirate and The Devious Damsel",
"Rence Vivotte",
1.95
};
使用结构成员运算符点(.)可以访问结构中的各个成员。例如:library.value 就是指 library 中的 value 部分。
在本质上,.title、.author、.value 在 book 结构中扮演了下标的角色。结构中各个成员仍拥有自己的变量类型,可以像其对应的数据类型那样使用它。
C99 支持结构的指定初始化项目,其语法与数组的指定初始化项目相似,只是表示具体元素的方法不同。
//只初始化book结构的成员value
struct book library = {
value = 25.99
};
//按任意顺序使用指定初始化项目
struct book library = {
.value = 25.99,
.author = "James Broadfool",
.title = "Rue for the Toad"
};
另外,对特定成员多次初始化,最后一次赋值有效。
struct book library[100]; //声明library为一个具有100个元素的数组,每个元素都是book类型的结构
library 本身不是结构名,它是元素类型为 struct book 结构的数组名。
标识结构数组的成员:在结构名后加一个点运算符,然后是成员名。例如:library[0].value 标识第一个数组元素的 value成员。
总结:
library //book结构数组
library[2] //数组元素,是一个book结构
library[2].value //library[2]的title成员,是一个char数组
library[2].value[4] //title成员数组中的一个字符
struct names { //第一个结构
char first[10];
char last[10];
};
struct user { //第二个结构
struct names handle; //嵌套结构
char job[20];
float income;
};
struct user fellow { //初始化结构
{"Huang","Jin"},
"personality coach",
12580.00
};
·若要对嵌套结构的成员进行访问,只需使用两次点运算符:
(fellow.handle).first //先找到fellow的成员handle,进而找到handle的成员first
使用指向结构的指针的原因:
struct user *him;
首先是关键字 struct,然后是结构标记 user,然后是一个 * 号,紧跟着是指针名。这个声明不是建立一个新的结构,而是意味着指针 him 可以指向任何现有的 user 类型的结构。例如 fellow 是一个 user 类型的结构,则可以:
him = &fellow; //结构的名字不是该结构的地址,必须使用&运算符
指针 him 指向结构 fellow,可以使用两种方法来利用 him 获取 fellow 的成员值:
him->income == fellow.income; //使用运算符 ->
(*him).income == fellow.income; //&和*是一对互逆的运算符