C/C++中函数参数传递
C或C++中函数的参数传递包括:值传递、指针传递、引用传递这三种方法。
以经典的交换两个整数为例:
问题描述:
输入描述:两个待交换的整数。
程序输出:交换后的两个整数。
值传递
#include<stdio.h>
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;
}
指针传递
#include<stdio.h>
//指针传递,函数体内只有指针值的变化
void myswap(int *p1, int *p2)
{
int t;
t=*p1;
*p1=*p2;
*p2=t;
}
//指针传递,函数体内只有指针的变化
void myswap2(int *p1,int *p2)
{
int *temp;
temp=p1;
p1=p2;
p2=temp;
}
int main()
{
int a, b;
printf("请输入待交换的两个整数:");
scanf("%d %d", &a, &b);
myswap(&a,&b); //交换两个整数的地址
printf("调用交换函数后的结果是:%d 和 %d\n", a, b);
return 0;
}
引用传递
#include<stdio.h>
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); //直接以变量a和b作为实参交换
printf("调用交换函数后的结果是:%d 和 %d\n", a, b);
return 0;
}
输出结果
值传递:
输入:2 3
输出:2 3
指针传递:
输入:2 3
输出:3 2
引用传递:
输入:2 3
输出:3 2
总结
在第一个程序中,传值不成功的原因是指在形参(x、y)上改变了数值,没有在实参(a、b)上改变数值。
值传递:值传递传递的是实际参数的一个副本,只是将输入a、b的值拷贝给了x、y,然而交换函数对x、y的操作只是对临时分配的栈中内容进行操作,函数执行完后形参就消失,对实际a、b不产生影响。
在第二个程序中,传地址成功的原因利用指针改变了原来的地址,所以实参就交换了。
指针传递:将形参指针p1、p2指向a、b的地址,交换函数是将指针指向地址中的值进行交换,而不是交换p1、p2指向的地址,因此第二个程序中,第一个交换函数可以实现a、b值交换,第二个交换函数无法实现a、b值的交换。
在第三个程序中,引用是直接改变两个实参变量a,b的值,所以就交换了。这里的形参为引用类型,引用与实参进行绑定,作为实参的别名。所以,使用引用类型,传入实参后,函数对引用的操作,就是对实参的操作,所以实参会发生变化。
引用传递:引用传递时,对形参的操作等同于对实参的操作,即传递的不会是实参的副本,而就是实参。