1 00:00:00,000 --> 00:00:00,320 2 00:00:00,320 --> 00:00:02,700 >> DAVID J.马兰:让我们在写一个程序 我们尝试交换的价值 3 00:00:02,700 --> 00:00:04,970 两个变量,x和y。 4 00:00:04,970 --> 00:00:07,490 事先,我已经写了很多 这一计划已经的。 5 00:00:07,490 --> 00:00:11,130 首先,我声明了一个变量x, 并存储在它的价值,1。 6 00:00:11,130 --> 00:00:14,120 然后我声明变量y和 在其存储的值,2。 7 00:00:14,120 --> 00:00:17,700 >> 然后,我继续printf显示 这两个变量的值。 8 00:00:17,700 --> 00:00:21,090 然后我要求与其他的printf 将交换这些变量。 9 00:00:21,090 --> 00:00:23,690 然后,我调用了交换功能。 10 00:00:23,690 --> 00:00:26,100 然后我要求的变量 已互换。 11 00:00:26,100 --> 00:00:30,610 然后我打印出了什么我要求 是x和y的新值。 12 00:00:30,610 --> 00:00:32,030 >> 那么什么是这个函数swap? 13 00:00:32,030 --> 00:00:34,970 这不是自带的C。 事实上,如果我们看一下顶部我 14 00:00:34,970 --> 00:00:38,850 文件,你会发现,我已经声明 原型为这个函数swap 15 00:00:38,850 --> 00:00:42,750 指定,它需要两个整数, 任意地称为a和b,并且此 16 00:00:42,750 --> 00:00:44,300 函数不返回任何东西。 17 00:00:44,300 --> 00:00:48,370 因此推测,它做什么,它说 在掉期和b的值。 18 00:00:48,370 --> 00:00:50,170 现在让我们来实现交换。 19 00:00:50,170 --> 00:00:53,820 >> 首先,我要声明一个临时 变量,并分配给它 20 00:00:53,820 --> 00:00:57,260 在a的值,虽然我可以只 因为容易储存在里面湾 21 00:00:57,260 --> 00:01:00,925 我当时要去改变数值 的是等于b中。 22 00:01:00,925 --> 00:01:04,849 然后最后,我要改变 的B值是什么了,但 23 00:01:04,849 --> 00:01:06,340 现在的温度。 24 00:01:06,340 --> 00:01:08,910 >> 现在,我要求什么我刚刚做 在逻辑上是正确的。 25 00:01:08,910 --> 00:01:12,780 我已经存储在一个临时变量, 改变了的值是B的,然后 26 00:01:12,780 --> 00:01:15,580 改变B的值是什么的了。 27 00:01:15,580 --> 00:01:18,620 但是,当我编译并运行此 程序,我担心这不是 28 00:01:18,620 --> 00:01:20,140 将我所看到的。 29 00:01:20,140 --> 00:01:21,625 >> 作,没有交换。 30 00:01:21,625 --> 00:01:24,350 点斜线,没有交换。 31 00:01:24,350 --> 00:01:27,560 不幸的是,根据printf的, x和y的值,即使 32 00:01:27,560 --> 00:01:31,560 之后我们声称要​​交换 它们仍然是1和2。 33 00:01:31,560 --> 00:01:32,630 >> 现在,这是为什么? 34 00:01:32,630 --> 00:01:36,160 嗯,事实证明,在主,当我们 调用这个函数的交换,传递 35 00:01:36,160 --> 00:01:39,960 x和y作为参数,它实际上 x和y的副本即 36 00:01:39,960 --> 00:01:41,310 传递到交换。 37 00:01:41,310 --> 00:01:45,430 即,它们的值1和2是 通过掉期为a和b。 38 00:01:45,430 --> 00:01:48,590 而且它是a和b,我们是最终 交换主。 39 00:01:48,590 --> 00:01:50,810 >> 即,1变为2,2变为1。 40 00:01:50,810 --> 00:01:54,630 但由于交换没有返回值 并且,因为它接收到的x副本 41 00:01:54,630 --> 00:01:58,220 和y,它的行为已 关于x和y的任何效果。 42 00:01:58,220 --> 00:02:02,610 事实上,a和b的作用域,可以这么说, 交换,而x和y保持 43 00:02:02,610 --> 00:02:03,990 作用域主。 44 00:02:03,990 --> 00:02:05,070 >> 因此,我们有一个问题。 45 00:02:05,070 --> 00:02:06,320 但如何解决它? 46 00:02:06,320 --> 00:02:08,312