一、函数参数的传值
1.传值调用
例:交换两个整型变量的函数
void swap(int x,int y)
{
int temp;
temp=x;
x=y;
y=temp;
cout<<x<<" "<<y<<endl;
}
int main()
{
int a,b;
cin>>a>>b;
swap(a,b);
cout<<a<<" "<<b<<endl;
}
运行结果:
输入:2 3
输出:3 2
2 3
调用函数结束后并未交换两个数,这是因为主函数调用swap函数时,系统建立形式参数x,y,把实参a,b值赋给x,y作为初始值。swap函数的操作对实参a,b无影响。返回主函数后,形参x,y的值被撤销,实际参数a,b的值并没有改变。这称为函数的传值调用。
函数的传值调用对实参无影响,较为安全,但在将实参赋给形参过程中相对后两种调用方式耗时较多,效率偏低
2.传指针调用
如何改进1-1中的swap函数,使它交换两个实参的值呢?
传指针调用就是一种方法
在此之前先先简要了解一下指针变量
指针变量是的内容是一个地址,它所指向的地址上存放的变量为目标变量
有人做过形象的比喻,如果说变量是商品,那么指针就相当于商品上的标签
声明: int *p; //声明一个指向int型的指针变量p,注意 * 的多义性
int m;
p=&m //&在此处为取地址符号,p获得m的地址值,即p指向m,m为目标变量
cout<<*p<<m<<endl;//*p 表示p指向的目标变量,即m;
了解这些之后,就可以对1-1中的swap函数进行调整
例1-1-改-1:
swap(int *x,int *y)
{
int temp=*x;
*x=*y;
*y=temp;
}
int main()
{
int a,b;
cin>>a>>b;
swap(&a,&b);
cout<<a<<" "<<b<<endl;
}
输入:2 3;
输出:3 2;
由此可见,以传指针调用的的方式可以实现对实参的改动。
3.传引用调用
在此之前先简要了解一下引用的概念
int a,b;
cin>>a>>b;
int &ra=a; //ra是a的别名,只能在a定义时初始化,此过程中实际上是ra获得了a的地址值
ra=b; //借用引用可以改变引用对象的值
cout<<a<<endl;//此时输入的值与b相等
由此可以使用另一种方式写swap函数
1-1改-2:
swap(int &x int &y)
{
int temp;
temp=x;
x=y;
y=temp;
}
int main()
{
int a,b;
cin>>a>>b;
swap(a,b);
cout<<a<<" "<<b<<endl;
}
输入:2 3;
输出:3 2;
传引用调用不需要像指针参数那样通过间接访问实参对象,特别适用于大对象参数的高效操作。