返回介绍

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

发布于 2024-10-10 23:21:27 字数 2500 浏览 0 评论 0 收藏 0

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

但不可以这样做。尽管结构可以像数组那样在结构中保存字段,但读取时只能按名访问。可以使用“.”运算符访问结构字段。如果你用过 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 字段指向相同字符串。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文