C Primer Plus (第五版)中文版——第 14 章 结构和其他数据形式

14.1  示例问题:创建图书目录

3个重要技巧:

  • 建立结构的格局或布局。
  • 声明遵循该变量的布局。
  • 获取对一个结构变量的各个部件的访问。

14.2  建立结构声明

结构声明是描述结构如何组合的主要办法。结构声明叫做模板,例如:

struct book {
        char title[41];
        char author[31];
        float value;
};
  • 该声明描述了一个由两个字符数组和一个 float 变量组成的结构。它并没有创建实际的数据对象,而是描述了组成这类对象的元素。
  • 首先使用了关键字 struct,表示接下来是一个结构。后面是一个可选(若想要多次使用一个结构模板,就需要标记)的标记“book”,它是用来引用该结构的快速标记。以后就可以这样声明:
struct book library;    //把library声明为一个使用book结构设计的结构变量
  • 接下来是用一对花括号括起来的结构成员列表。每个成员变量都用自己的声明来描述,并以一个分号来结束。
  • 结束花括号后面的分号表示结构设计定义的结束。

结构声明可以放在任何函数的外面,也可以放在一个函数定义内部。

14.3  定义结构变量

结构有两个意思:结构设计和结构变量。

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;        //在定义之后跟变量名

14.3.1  初始化结构

要初始化一个结构变量,可以使用与初始化数组类似的方法:使用一个花括号括起来的、逗号分隔的初始化项目列表进行初始化

struct book library = {
        "The Pirate and The Devious Damsel",
        "Rence Vivotte",
        1.95
};

14.3.2  访问结构成员

使用结构成员运算符点(.)可以访问结构中的各个成员。例如:library.value 就是指 library 中的 value 部分。

在本质上,.title、.author、.value 在 book 结构中扮演了下标的角色。结构中各个成员仍拥有自己的变量类型,可以像其对应的数据类型那样使用它。

14.3.3  结构的指定初始化项目

C99 支持结构的指定初始化项目,其语法与数组的指定初始化项目相似,只是表示具体元素的方法不同。

//只初始化book结构的成员value
struct book library = {
        value = 25.99
};
//按任意顺序使用指定初始化项目
struct book library = {
        .value = 25.99,
        .author = "James Broadfool",
        .title = "Rue for the Toad"
};

另外,对特定成员多次初始化,最后一次赋值有效。

14.4  结构数组

14.4.1  声明结构数组

struct book library[100];    //声明library为一个具有100个元素的数组,每个元素都是book类型的结构

 library 本身不是结构名,它是元素类型为 struct book 结构的数组名。

14.4.2  标识结构数组的成员

标识结构数组的成员:在结构名后加一个点运算符,然后是成员名。例如:library[0].value 标识第一个数组元素的 value成员。

总结:

library                 //book结构数组
library[2]              //数组元素,是一个book结构
library[2].value        //library[2]的title成员,是一个char数组
library[2].value[4]     //title成员数组中的一个字符

14.5  嵌套结构

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

14.6  指向结构的指针

使用指向结构的指针的原因:

  • 指向结构的指针通常比结构本身更容易操作。
  • 在早期 C 实现中,结构不能作为参数被传递给函数,但指向结构的指针可以。
  • 许多奇妙的数据表示都使用了包含指向其他结构的指针的结构。

14.6.1  声明和初始化结构指针

struct user *him; 

首先是关键字 struct,然后是结构标记 user,然后是一个 * 号,紧跟着是指针名。这个声明不是建立一个新的结构,而是意味着指针 him 可以指向任何现有的 user 类型的结构。例如 fellow 是一个 user 类型的结构,则可以:

him = &fellow;         //结构的名字不是该结构的地址,必须使用&运算符

14.6.2  使用指针访问成员

指针 him 指向结构 fellow,可以使用两种方法来利用 him 获取 fellow 的成员值:

him->income == fellow.income;         //使用运算符 ->
(*him).income == fellow.income;         //&和*是一对互逆的运算符

14.7  向函数传递结构信息

 

 

 

 

 

 

 

你可能感兴趣的:(C语言,C,Primer,Plus)