(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!”?从每一栏中选择一个单词或符号,组成表达式。
要点
当调用函数时,计算机会把值复制给形参变量。
可以像创建其他类型的指针那样创建结构指针。
“指针
->
字段”等于“(*指针).字段”。“
->
”表示法省掉了括号,代码更易阅读。