当前位置:嗨网首页>书籍在线阅读

30-更改主调函数中的变量

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

9.6 更改主调函数中的变量

有时需要在一个函数中更改其他函数的变量。例如,普通的排序任务中交换两个变量的值。假设要交换两个变量 xy 的值。简单的思路是:

x = y;
y = x;

这完全不起作用,因为执行到第2行时, x 的原始值已经被 y 的原始值替换了。因此,要多写一行代码,存储 x 的原始值:

temp = x;
x = y;
y = temp;

上面这3行代码便可实现交换值的功能,可以编写成一个函数并构造一个驱动程序来测试。在程序清单9.13中,为清楚地表明变量属于哪个函数,在 main() 中使用变量 xy ,在 interchange() 中使用 uv

程序清单9.13  swap1.c 程序

/* swap1.c -- 第1个版本的交换函数 */
#include <stdio.h>
void interchange(int u, int v); /* 声明函数 */
int main(void)
{
     int x = 5, y = 10;
     printf("Originally x = %d and y = %d.\n", x, y);
     interchange(x, y);
     printf("Now x = %d and y = %d.\n", x, y);
     return 0;
}
void interchange(int u, int v)  /* 定义函数  */
{
     int temp;
     temp = u;
     u = v;
     v = temp;
}

运行该程序后,输出如下:

Originally x = 5 and y = 10.
Now x = 5 and y = 10.

两个变量的值并未交换!我们在 interchange() 中添加一些打印语句来检查错误(见程序清单9.14)。

程序清单9.14  swap2.c 程序

/* swap2.c -- 查找swap1.c的问题 */
#include <stdio.h>
void interchange(int u, int v);
int main(void)
{
     int x = 5, y = 10;
     printf("Originally x = %d and y = %d.\n", x, y);
     interchange(x, y);
     printf("Now x = %d and y = %d.\n", x, y);
     return 0;
}
void interchange(int u, int v)
{
     int temp;
     printf("Originally u = %d and v = %d.\n", u, v);
     temp = u;
     u = v;
     v = temp;
     printf("Now u = %d and v = %d.\n", u, v);
}

下面是该程序的输出:

Originally x = 5 and y = 10.
Originally u = 5 and v = 10.
Now u = 10 and v = 5.
Now x = 5 and y = 10.

看来, interchange() 没有问题,它交换了 uv 的值。问题出在把结果传回 main() 时。 interchange() 使用的变量并不是 main() 中的变量。因此,交换 uv 的值对 xy 的值没有影响!是否能用 return 语句把值传回 main() ?当然可以,在 interchange() 的末尾加上下面一行语句:

return(u);

然后修改 main() 中的调用:

x = interchange(x,y);

这只能改变 x 的值,而 y 的值依旧没变。用 return 语句只能把被调函数中的一个值传回主调函数,但是现在要传回两个值。这没问题!不过,要使用指针。