和指针起航

想象你在为一个游戏编写程序,游戏中玩家需要控制船的航向……

和指针起航 - 图1

游戏需要控制很多东西,比如得分、生命值和玩家当前的位置。你不想把游戏写成一段很长的代码,而是可以创建许多小的函数,让每个函数完成游戏的一个功能。

和指针起航 - 图2

那么这和指针有什么关系?让我们先不考虑指针,写写看。你将和往常一样使用变量,游戏的主要部分是驾驶你的船在百慕大三角航行,我们具体看看代码需要在航行函数中完成哪些事。

船长,向东航行!

和指针起航 - 图3

游戏用纬度(latitude)和经度(longitude)记录玩家的位置,纬度标记玩家南北方向的位置,经度标记玩家东西方向的位置。如果玩家想要向东南方向航行,他的纬度将减小,经度将增加:

于是可以写一个go_south_east()函数,它接收latitudelongitude这两个变量,然后对它们进行加、减操作:

和指针起航 - 图4

程序开始时船的位置是[32, -64],如果它向东南方向航行,船的新坐标将是[31, -63],前提是代码正确工作……

和指针起航 - 图5脑力风暴

仔细看看这段代码,你认为它能正确工作吗?为什么?

和指针起航 - 图6试驾

程序应该将船从[32, -64]向东南方向移动到[31, -63],但编译并运行程序,结果却是:

和指针起航 - 图7

船准确地停在了原来的位置。

C语言按值传递参数

C语言调用函数的方式是导致这段代码不能正确工作的原因。

  • 一开始,main()函数有一个叫longitude的局部变量,它的值是32。

和指针起航 - 图8

  • 当计算机调用go_south_east()函数时,它将变量longitude的值复制给了参数lon,这只是一个赋值的过程,从变量longitude到变量lon。也就是说,当你调用函数时,作为参数传递的不是变量,而只是变量的值。

  • go_south_east()函数修改了lon的值时,函数只是修改了本地的副本,也就是说程序返回main()函数时,变量longitude中保存的还是它原来的值32。

和指针起航 - 图9

既然C语言就是这样调用函数的,那么怎么才能在函数中更新变量呢?

如果用指针,事情就好办多了……