传值调用:
传值调用是指当一个函数被调用时,C++根据实参和形参的对应关系将实参的值一一复制给形参,即实参的值单向传递给形参。但函数本身并不对实参进行任何操作,即使形参的值在函数中改变,实参的值也不会受到影响。
传址调用:
向函数传递参数的传址调用方法,是指把引用的地址复制给形式参数。在函数内,该引用用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。
下面给出传值调用的代码:
#include<stdio.h>
void swap(int x,int y)//形参
{
int tmp = x;
x = y;
y = tmp;
}
int main()
{
int a, b, c;
printf("请输入任意三个数\n");
scanf("%d %d %d", &a, &b, &c);
if (a > b)
{
swap(a, b); // 实参
}
if (b > c)
{
swap(b, c);
}
if (a > b)
{
swap(a,b);
}
printf("这三个数从小到大依次为%d %d %d:\n", a, b, c);
return 0;
}
下图为运行结果
可见传值调用并未影响实参,这是因为swap这个函数在传参时将实参a和b传递给x和y只是把a和b的值拷贝给x和y,x和y的交换不会影响a和b。
而要想将a和b交换则需要引用调用。
下面给出传址调用的代码:
#include<stdio.h>
void swap(int* px, int* py) // 形参
{
int tmp = *px;
*px = *py;
*py = tmp;
}
int main()
{
int a, b, c;
printf("请输入任意三个数\n");
scanf("%d %d %d", &a, &b, &c);
if (a > b)
{
swap(&a, &b); // 实参
}
if (b > c)
{
swap(&b, &c);
}
if (a > b)
{
swap(&a, &b);
}
printf("这三个数从小到大依次为%d %d %d:\n", a, b, c);
return 0;
}
下图为运行结果:
可见传址调用可真正实现实参a和b的交换。