栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++函数的三种传参方式(值传递,地址传递,引用传递)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++函数的三种传参方式(值传递,地址传递,引用传递)

先公布上期每日一练的答案(汉诺塔问题):

#include
using namespace std;
void move(char src, char dest)
{
	cout << src << "-->" << dest<> m;
	cout << "the step to moving " << m << "diskes:" << endl;
	hanoi(m, 'A', 'B', 'C');
	return 0;
}

我们这期主要来探讨一下函数的三种不同的传参方式,分别是值传递,地址传递和引用传递,那么这三种传递方式有什么区别呢,请先看这个例子:

#include 
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 
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 
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进行操作,所以引用传递也是可以起到修饰形参的作用。

以上就是本期的全部内容了,有喜欢的读者可以点个关注哦!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/395865.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号