使用“.”运算符读取结构字段
因为结构和数组有些像,你可能以为能像读取数组元素那样读取结构字段:
但不可以这样做。尽管结构可以像数组那样在结构中保存字段,但读取时只能按名访问。可以使用“.”运算符访问结构字段。如果你用过JavaScript或Ruby这样的语言,一定会觉得非常眼熟:
行了,既然你已经学会使用结构了,看看能否修改刚才的代码……
你的任务是写一个新版的catalog()
函数,函数将使用fish结构。从游泳池中取出代码片段,填入空白横线处。每个片段只能使用一次,有的可能一次都用不到。
你的任务是写一个新版的catalog()
函数,函数将使用fish结构。请从游泳池中取出代码片段,填入空白横线处。
试驾
你已经重写了catalog()
函数,重写label()
对你来说也是小菜一碟。写完以后就可以编译代码,检查它能否正确运行:
好极了!代码和刚才一样能够正确运行,不同的是,这次调用函数的代码变得异常简洁:
catalog(snappy);
label(snappy);
代码的可读性提高了,而且当你决定在结构中保存额外的数据时,不必修改使用结构的函数。
这里没有蠢问题
问:结构就是数组吗?
答:不是数组,不过结构把多条数据组合在一起,这点和数组很像。
问:数组变量就是一个指向数组的指针,那么结构变量是一个指向结构的指针吗?
答:不是,结构变量是结构本身的名字。
问:我可以用下标
[0]
、[1]
……访问结构字段吗?答:不可以,你只能按名访问。
问:结构就相当于其他语言中的类?
答:它们很相似,但在结构中添加方法可就没那么容易了。
聚焦存储器中的结构
在定义结构时,你并没有让计算机在存储器中创建任何东西,只是给了计算机一个模板,告诉它你希望新的数据类型长什么样子。
- struct fish {
- const char name;
- const char species;
- int teeth;
- int age;
- };
当定义新变量时,计算机则需要在存储器中为结构的实例创建空间,这块空间必须足够大,以装下结构中的所有字段:
那么当把一个结构变量赋给另一个结构变量时会发生什么?计算机会创建一个全新的结构副本,也就是说,计算机需要再分配一块存储器空间,大小和原来相同,然后把每个字段都复制过去。
切记,为结构变量赋值相当于叫计算机复制数据。
复制的是指向字符串的指针,而非字符串本身。
当把一个结构变量赋给另一个结构变量,计算机会复制结构的内容。如果结构中含有指针,那么复制的仅仅是指针的值,像这里,
gnasher
和snappy
的name
和species
字段指向相同字符串。