问题及代码
/*
*copyright (c).2016,烟台大学计算机与控制工程学院
*All rights reserved.
*文件名称:传值.cpp
*作者:王力源
*完成日期:2016年9月8号
*版本号:v1.0
*
*问题描述:C语言提供了两种函数参数传递的方式:传值和传地址。在C++中,又拓展了引用方式。针对此C语言程序,到底哪一种能够达到参数传递的目的?
*输入描述:两个整数,代表传值前的两个值
*输出描述:参数传递后的两个整数
*/
//(1)传值
#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;
}
//(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;
}
解释交换方法:
(1)第一种的传值,a和b分别赋值于x和y,在函数实现的过程中x与y的值发生了交换即在过程中a,b产生了交换,但是在函数结束后x和y消除,a与b的交换的值也随之消除,两者仍然没有交换。
(2)第二种传地址,a的地址传给p1,b的地址传给p2,在函数进行过程中p1和p2的地址互换,此时a与b的值也互换,函数结束后p1,p2消除,a和b的值已经交换,所以最后输出能够交换。
(3)第三种引用作形参的方式中a与x是同一个地址,b与y是同一个地址,函数过程中x与y的地址互换就相当于a和b的地址互换,函数结束后x和y消除,a和b的值完成交换,所以输出交换。