(t).age和t.age

为什么*t外面一定要加括号?因为(*t).age*t.age完全是两个不同的表达式。

(*t).age和*t.age - 图1

表达式*t.age等于*(t.age)。请思考一下表达式*(t.age)的含义。它代表“t.age这个存储器单元中的内容”,但t.age不是存储器单元。

使用结构时要小心括号的位置,它们会影响表达式的值。

(*t).age和*t.age - 图2试驾

检查程序有没有错误:

(*t).age和*t.age - 图3

太棒了,现在函数正确工作了。

(*t).age和*t.age - 图4

通过传递结构指针,函数更新了原来的数据,而不是修改本地的副本。

(*t).age和*t.age - 图5

是的,还有一种表示结构指针的方法,它更易于阅读。

为了把括号放对地方,在处理指针时需要非常谨慎,因此C语言的发明者设计了一种更简洁、更易于阅读的语法。下面两个表达式含义相同:

(*t).age和*t.age - 图6

t->age表示“由t指向的结构中的age字段”,也就是说happy_birthday()函数还能这么写:

  1. void happy_birthday(turtle *a)
  2. {
  3. a->age = a->age + 1;
  4. printf("Happy Birthday %s! You are now %i years old!\n", a->name, a->age);
  5. }

(*t).age和*t.age - 图7保险箱窃贼

嘘……夜深了,这里是银行的金库。你能把密码轮旋转到正确的位置,破解保险箱吗?研究以下代码,看能不能找到正确的组合,偷到金子。小心!有个类型叫swag,有个字段也叫swag

(*t).age和*t.age - 图8

银行用以下语句创建了保险箱:

(*t).age和*t.age - 图9

哪种组合能让你得到字符串“GOLD!”?从每一栏中选择一个单词或符号,组成表达式。

(*t).age和*t.age - 图10

 

这里没有蠢问题

问:为什么计算机要把值复制给形参变量?

:计算机通过把值赋给函数形参的方式向函数传值,所有赋值都会复制值。

问:为什么*t.age(*t).age的含义不同?

:因为计算机先对“点”运算符求值,然后对*运算符求值。

 

(*t).age和*t.age - 图11保险箱窃贼解答

嘘……夜深了,这里是银行的金库。你把密码轮旋转到正确的位置,破解了保险箱。你研究了以下代码,找到了正确的组合,顺利偷到了金子。

(*t).age和*t.age - 图12

银行用以下语句创建了保险箱:

(*t).age和*t.age - 图13

哪种组合能让你得到字符串“GOLD!”?从每一栏中选择一个单词或符号,组成表达式。

(*t).age和*t.age - 图14

 

(*t).age和*t.age - 图15要点

  • 当调用函数时,计算机会把值复制给形参变量。

  • 可以像创建其他类型的指针那样创建结构指针。

  • “指针->字段”等于“(*指针).字段”。

  • ->”表示法省掉了括号,代码更易阅读。