问题及代码:
/*
*Copyright (c) 2014 , 烟台大学计算机学院
*All right resvered .
*文件名称: test.cpp
*作 者: 郑兆涵
*完成日期: 2015年9月8日
*版 本 号: v1.0
*
*问题描述: 编制三个程序,分别调用三个版本的swap交换函数,观察结果
*输入描述: 输入两个整数。
*程序输出: 输出两个交换之后的整数。
*/
#include<stdio.h>
//(1)传值:
void swap(int x, int y)
{
int t;
t=x;
x=y;
y=t;
}
//(2)传地址:
void swap(int *p1, int *p2)
{
int t;
t=*p1;
*p1=*p2;
*p2=t;
}
//(3)引用作形参:
void swap(int &x, int &y)
{
int t;
t=x;
x=y;
y=t;
}
//以下是调用它们的主函数:
int main()
{
int a,b;
printf("请输入待交换的两个整数:");
scanf("%d %d", &a, &b);
//swap(a,b);
//swap(&a,&b);
//swap(a,b);
printf("调用交换函数后的结果是:%d %d\n", a, b);
return 0;
}
运行结果:
(1)传值:
(2)传地址:
(3)引用作形参:
知识点总结:
通过以上的三个swap函数编写及调用,我们不难发现:
(1)使用传值方法调用swap函数,虽然括号中的三条简单语句非常经典,但是却无法调换成功。观察(1)传值swap函数,我们发现,在程序里,有int a=2,int b=3,且我们需要调用swap(a,b)来交换2和3的位置,但是我们要清楚a和b占用两个空间,其中a和b是2和3。当在调用swap(x,y)的时候,系统会给x分配空间,也会给y分配空间,将a的值传递给x,将b的值传递给y,这样使得x=2,y=3.在执行算法的过程中,会借助于 t 这个变量,将 x 和 y 里面的值互相交换,使得 x=3,y=2 。而在我们交换之后,我们会清楚的看到,我们所交换的是 x 和 y 的值,也就是所谓的形式参数,而对于要交换的a和b却是无效的。因此我们在实际运行程序的时候,系统无法将a和b的值进行交换。
(2)使用传地址的方法调用swap函数,我们在调用swap(a,b)时,我们所调用的是a的地址&a和b的地址&b,这时候,x和y分别作为指针指向a和b,这其中,a=2,b=3。随后,在执行过程中,t赋值为x所指向的值,使得t等于x所指向的值,得到t=2,而x所指向的值赋值为y所指向的值,最后是y指向的值赋值为t所代表的值2,,因此使用传地址的方法,我们可以将a,b的值进行交换。
(3)使用引用作形参的方法调用swap函数,加入引用数据类型,原先的a=2,b=3,在使用引用的时候,我们会发现,对形式参数x,它是a的引用,x与a所占用的内存相同,同样的,y作为b的引用,y与b所占用的内存也是相同的,最终在执行过程中,进行x和y的交换,其实也就是交换了x和y所占用的空间,换句话说,也就是交换了a和b。因此使用引用作形参的方法也可以将a,b的值进行交换。
学习心得:
通过以上的三个调用swap函数的事例,我发现,如果直接用程序设计语言去表示算法的话,由于我们必须去考虑,程序设计语言的语句和其中的机制,因此容易把问题变得复杂。所以在描述算法的时候,应该避免把算法搞复杂,而应该尽量的写清楚中间形式的表达。