(*t).age 和*t.age
为什么
*t 外面一定要加括号?因为(*t).age 与*t.age 完全是两个不同的表达式。
表达式*t.age 等于*(t.age) 。请思考一下表达式*(t.age) 的含义。它代表“t.age 这个存储器单元中的内容”,但 t.age 不是存储器单元。
使用结构时要小心括号的位置,它们会影响表达式的值。
试驾
检查程序有没有错误:
太棒了,现在函数正确工作了。
通过传递结构指针,函数更新了原来的数据,而不是修改本地的副本。
是的,还有一种表示结构指针的方法,它更易于阅读。
为了把括号放对地方,在处理指针时需要非常谨慎,因此 C 语言的发明者设计了一种更简洁、更易于阅读的语法。下面两个表达式含义相同:
t->age 表示“由 t 指向的结构中的 age 字段”,也就是说 happy_birthday() 函数还能这么写:void happy_birthday(turtle *a){ a->age = a->age + 1; printf("Happy Birthday %s! You are now %i years old!\n", a->name, a->age);}
保险箱窃贼
嘘……夜深了,这里是银行的金库。你能把密码轮旋转到正确的位置,破解保险箱吗?研究以下代码,看能不能找到正确的组合,偷到金子。小心!有个类型叫 swag ,有个字段也叫 swag 。银行用以下语句创建了保险箱:哪种组合能让你得到字符串“GOLD!”?从每一栏中选择一个单词或符号,组成表达式。
这里没有蠢问题问:为什么计算机要把值复制给形参变量?答:计算机通过把值赋给函数形参的方式向函数传值,所有赋值都会复制值。问:为什么*t.age 与(*t).age 的含义不同?答:因为计算机先对“点”运算符求值,然后对* 运算符求值。
保险箱窃贼解答
嘘……夜深了,这里是银行的金库。你把密码轮旋转到正确的位置,破解了保险箱。你研究了以下代码,找到了正确的组合,顺利偷到了金子。银行用以下语句创建了保险箱:哪种组合能让你得到字符串“GOLD!”?从每一栏中选择一个单词或符号,组成表达式。
要点
当调用函数时,计算机会把值复制给形参变量。
可以像创建其他类型的指针那样创建结构指针。
“指针
-> 字段”等于“(*指针).字段”。
“-> ”表示法省掉了括号,代码更易阅读。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论