先公布上期每日一练的答案(汉诺塔问题):
#include<iostream>
using namespace std;
void move(char src, char dest)
{
cout << src << "-->" << dest<<endl;
}
void hanoi(int n, char src, char medium, char dest)
{
if (n == 1)
move(src, dest);
else
{
hanoi(n - 1, src, dest, medium);
move(src, dest);
hanoi(n - 1, medium, src, dest);
}
}
int main()
{
int m;
cout << "Enter the number of diskes:";
cin >> m;
cout << "the step to moving " << m << "diskes:" << endl;
hanoi(m, 'A', 'B', 'C');
return 0;
}
我们这期主要来探讨一下函数的三种不同的传参方式,分别是值传递,地址传递和引用传递,那么这三种传递方式有什么区别呢,请先看这个例子:
#include <iostream>
using namespace std;
void exchange(int a, int b)
{
int temp;
temp = a;
a = b;
b = temp;
}
int main()
{
int x, y;
cin >> x >> y;
exchange(x, y);
cout << x << " " << y;
}
不难看出,这是一个用于交换两个数字的函数,但是请读者想一下,这个函数能实现这个功能吗?
事实上,这个是不能的,为什么?
因为这里的传参方式为值传递,什么叫值传递呢?我们从字面上理解,就是我们只是把实参x和y的数值赋值给形参a和b,那么在函数体内只是将形参a和b的值进行交换,并不会影响我们的实参x和y,所以我们有一个结论,值传递不会修饰实参。
哪有没有什么办法能让形参修饰实参呢?答案就是我们的地址传递和引用传递这两种传参方式了。
来看下列代码:
#include <iostream>
using namespace std;
void exchange(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int x, y;
cin >> x >> y;
exchange(&x, &y);
cout << x << y;
}
这里所用的就是地址传递了,所谓地址传递,也很好理解,传递的是地址,那么主函数调用的时候就要传进x和y的地址,这里就要用到取地址符(&),将x和y的地址传进去,函数里面由于a和b都是指针类型,所以在交换的时候要用到(*)来进行解引用的操作,解引用就是获取a和b对应地址下对应的值,例如a储存的是x的地址,那么*a就可以获得x的值,这样,我们就可以实现两数交换的操作了,所以地址传递是可以修饰实参的。
在C++中,还提供了另一种更为简便的方法,那就是引用传递的方式,事实上,引用的本质其实就是指针常量,所以也可以达到修饰实参的效果,代码如下:
#include <iostream>
using namespace std;
void exchange(int &a, int &b)
{
int temp;
temp = a;
a = b;
b = temp;
}
int main()
{
int x, y;
cin >> x >> y;
exchange(x, y);
cout << x << " " << y;
}
其实引用的作用就是给变量起一个别名,所以在这段代码中,a就相当于x的别名,那么在函数体内对a进行操作本质上就是对x进行操作,所以引用传递也是可以起到修饰形参的作用。
以上就是本期的全部内容了,有喜欢的读者可以点个关注哦!