问题及代码:
(1)传值
/*
* Copyright(c) 2016, 烟台大学计算机与控制工程学院
* All rights reserved.
* 作 者:田艺
* 完成日期:2016年 9月 8日
* 版 本 号:v1.0
* 问题描述:编制三个程序,分别调用三个版本的交换函数
* 输入描述:待交换的两个整数
* 程序输出:函数调用后的结果
*/
#include<iostream>
using namespace std;
void myswap(int x, int y)
{
int t;
t=x;
x=y;
y=t;
}
int main()
{
int a, b;
printf("请输入待交换的两个整数:");
scanf("%d %d", &a, &b);
myswap(a,b);
printf("调用交换函数后的结果是:%d 和 %d\n", a, b);
return 0;
}
运行结果:
交换不成功的原因:只是给形参赋值,并没有改变实参。
(2)传地址
#include<iostream>
using namespace std;
void myswap(int *p1, int *p2)
{
int t;
t=*p1;
*p1=*p2;
*p2=t;
}
int main()
{
int a, b;
printf("请输入待交换的两个整数:");
scanf("%d %d", &a, &b);
myswap(&a,&b);
printf("调用交换函数后的结果是:%d 和 %d\n", a, b);
return 0;
}
运行结果:
成功原因:指针把a与b指向的值进行了改变。
(3)引用做形参
#include<iostream>
using namespace std;
void myswap(int &x, int &y)
{
int t;
t=x;
x=y;
y=t;
}
int main()
{
int a, b;
printf("请输入待交换的两个整数:");
scanf("%d %d", &a, &b);
myswap(a,b);
printf("调用交换函数后的结果是:%d 和 %d\n", a, b);
return 0;
}
运行结果:
交换成功的原因:将所设的x,y与a,b放在同一个位置,内存地址所指向的数值便进行了改变。
知识点总结:
使用传值交换过的两个数不变,而另外两种交换方法交换过的数值是颠倒的,原因是进行传值交换时,就只是将两个数的数值交换,对a,b本身没有改变,只是在子函数中交换而没有在main函数中交换,所以不能成功的实现两个数的交换。而调用传地址交换的两个数则是直接对地址指向的内容进行交换故而交换成功。
学习心得:
了解了函数参数传递的不同方式,以及体会到指针对地址的指向作用使得传值变得简便。