提出问题:
示例:设计一个交换两个整数的算法。
(这个题看似简单,实际上是有一些坑的 ,考察形参和实参的用法,记得当时刚学C时也是踩过这个坑,所以在这里记下来加深一遍印象)
编写一个函数swap1(x,y):
void swap1(int x, int y)
{
int temp;
tmp = x;
x = y;
y = tmp; //交换形参x和y的值
}
当执行语句swap1(a,b)时, a和b实参值不会发生交换。
分析: x, y 即是输入型参数,也是输出型参数
改正方法1:
采用指针的方式来 回传形参的值,需要把上述函数修改为:
/*
交换形参x和y所指向的值
*/
void swap2(int *x, int *y)
{
int tmp;
tmp = *x; //将x的值放在tmp中
*x = *y; //将x所指的值改为*y
*y = tmp; //将y所指的值改为tmp
}
在调用时,上述函数改为swap2(&a, &b) ——》比较复杂
改正方法2:
采用引用性形参——》将输出型形参改为引用类型。
/*
交换形参x和y的值
*/
void swap(int &x, int &y)
//形参前的“&”符号不是指针运算符 助理需要注意一下
{
int tmp = x;
x = y; y = tmp;
}
当执行语句swap(a,b)时,形参和实参的匹配相当于:
int &x = a ; //a为x的引用
int &y = b; //b为y的引用
这样,a与x共享存储空间,b与y共享存储空间,因此执行函数后a和b的值发生了交换——》简单
后续思考
普通的参数值传递
//fun1()
void fun1(int n)
{
int m =2;
fun2(m);
printf("%d\n",m);
}
//fun2()
void fun2(int x)
{
x++;
printf("%d\n",x);
}
从实参到形参的单向值传递
fun1(m) ——————————》fun2(x)
引用类型的参数传递
//fun1()
void fun1(int n)
{
int m =2;
fun2(m);
printf("%d\n",m);
}
//fun2()
void fun2(int %x)
{
x++;
printf("%d\n",x);
}
从实参到形参的单向值传递
fun1(m) ——————————》fun2(x)
fun1(m) 《—————————— fun2(x)
形参回传给实参,实参和形参同步发生改变