使用“.”运算符读取结构字段

因为结构和数组有些像,你可能以为能像读取数组元素那样读取结构字段:

使用“.”运算符读取结构字段 - 图1

但不可以这样做。尽管结构可以像数组那样在结构中保存字段,但读取时只能按名访问。可以使用“.”运算符访问结构字段。如果你用过JavaScript或Ruby这样的语言,一定会觉得非常眼熟:

使用“.”运算符读取结构字段 - 图2

行了,既然你已经学会使用结构了,看看能否修改刚才的代码……

使用“.”运算符读取结构字段 - 图3

你的任务是写一个新版的catalog()函数,函数将使用fish结构。从游泳池中取出代码片段,填入空白横线处。每个片段只能使用一次,有的可能一次都用不到。

使用“.”运算符读取结构字段 - 图4

使用“.”运算符读取结构字段 - 图5

你的任务是写一个新版的catalog()函数,函数将使用fish结构。请从游泳池中取出代码片段,填入空白横线处。

使用“.”运算符读取结构字段 - 图6

使用“.”运算符读取结构字段 - 图7试驾

你已经重写了catalog()函数,重写label()对你来说也是小菜一碟。写完以后就可以编译代码,检查它能否正确运行:

使用“.”运算符读取结构字段 - 图8

好极了!代码和刚才一样能够正确运行,不同的是,这次调用函数的代码变得异常简洁:

  1. catalog(snappy);
  2. label(snappy);

代码的可读性提高了,而且当你决定在结构中保存额外的数据时,不必修改使用结构的函数。

这里没有蠢问题

问:结构就是数组吗?

:不是数组,不过结构把多条数据组合在一起,这点和数组很像。

问:数组变量就是一个指向数组的指针,那么结构变量是一个指向结构的指针吗?

:不是,结构变量是结构本身的名字。

问:我可以用下标[0][1]……访问结构字段吗?

:不可以,你只能按名访问。

问:结构就相当于其他语言中的类?

:它们很相似,但在结构中添加方法可就没那么容易了。

 

使用“.”运算符读取结构字段 - 图9聚焦存储器中的结构

在定义结构时,你并没有让计算机在存储器中创建任何东西,只是给了计算机一个模板,告诉它你希望新的数据类型长什么样子。

  1. struct fish {
  2. const char name;
  3. const char species;
  4. int teeth;
  5. int age;
  6. };

当定义新变量时,计算机则需要在存储器中为结构的实例创建空间,这块空间必须足够大,以装下结构中的所有字段:

使用“.”运算符读取结构字段 - 图10

那么当把一个结构变量赋给另一个结构变量时会发生什么?计算机会创建一个全新的结构副本,也就是说,计算机需要再分配一块存储器空间,大小和原来相同,然后把每个字段都复制过去。

使用“.”运算符读取结构字段 - 图11

切记,为结构变量赋值相当于叫计算机复制数据。

 

使用“.”运算符读取结构字段 - 图12

复制的是指向字符串的指针,而非字符串本身。

当把一个结构变量赋给另一个结构变量,计算机会复制结构的内容。如果结构中含有指针,那么复制的仅仅是指针的值,像这里,gnashersnappynamespecies字段指向相同字符串。