【菜鸟C++学习笔记】22. 参数的传递机制

1、按值传递

顾名思义,把变量的值直接传递给函数,如下面的例子:

#include <iostream>
using namespace std;
void swap(int x, int y)
{
	int z;
	cout<<"swap函数中,交换前x:"<<x<<"\t"<<"y:"<<y<<endl;
	z=x;
	x=y;
	y=z;
	cout<<"swap函数中,交换后x:"<<x<<"\t"<<"y:"<<y<<endl;
}
int main()
{
	int x=1,y=2;
	cout<<"主函数中,交换前x:"<<x<<"\t"<<"y:"<<y<<endl;
	swap(x,y);
	cout<<"主函数中,交换后x:"<<x<<"\t"<<"y:"<<y<<endl;
	return 0;
}
输出结果:


分析:

首先,在调用函数swap(x,y)时,直接把主函数中定义的x、y的值直接传递给swap函数;

发现第四行输出一个见鬼的事:主函数交换后,发现x、y的值没交换,坑爹啊!这是为神马呢?因为按值传递的机制是把要传递变量在栈中做一个副本后,在函数中运行,换句话说,本程序中只是把a、b的值在栈中复制了一下,传递给了swap函数,swap函数调用结束后,生命周期结束,随之栈中的两个副本的生命周期也结束了,所以最后输出的结果中还是主函数中定义的a和b的值。


2、按址传递

以传递地址的方式可以避开上面这种坑爹的结果,方法是把变量的内存地址传递给函数,因此程序需做下面的修订:

1)既然是把地址传递给函数,那函数怎么接受两个地址呢?很简单嘛,把主函数的两个接收参数改成俩指针就哦了!

2)把主函数中的变量前该加“*”的加上哦,否则就是指针指向的地址啦,加“*”后表示指针的值嗯

3)调用的时候把两个变量的地址作为参数传递给swap函数就ok了

改完后的程序如下:

#include <iostream>
using namespace std;
void swap(int *x, int *y)
{
	int z;
	cout<<"swap函数中,交换前x:"<<*x<<"\t"<<"y:"<<*y<<endl;
	z=*x;
	*x=*y;
	*y=z;
	cout<<"swap函数中,交换后x:"<<*x<<"\t"<<"y:"<<*y<<endl;
}
int main()
{
	int x=1,y=2;
	cout<<"主函数中,交换前x:"<<x<<"\t"<<"y:"<<y<<endl;
	swap(&x,&y);
	cout<<"主函数中,交换后x:"<<x<<"\t"<<"y:"<<y<<endl;
	return 0;
}
输出结果:


分析:

诺!这回对了吧,O(∩_∩)O~为啥捏,因为变量本来就在内存中啊,我只是告诉这个函数去哪里找它们罢了,把这俩变量的门牌号换了下,函数销毁了,变量还在原来那个地方,所以没有出现错误。


3、按引用传递

上面按地址传递修改的时候,加“*”神马的还是挺麻烦的,还记得上次说的那个外号功能么,这次它就可以大显神通啦!

改动方法超简单,把第一个程序的swap函数的俩接收参数设置为主函数中定义变量的外号就大功告成了!即:

void swap(int &x, int &y)

为啥呢?外号定义的时候必须初始化,事实上,把两个参数传递的时候就相当于把外号初始化了!就是说传参的时候,等于有个隐含的意思:

int &x=x  int &y=y

因此x、y就成了主函数中x、y的外号,程序其他部分不用动,因为对外号的值修改,就相当于对它的主人的值进行修改了,而试验后发现果然结果依然正确。而且这种方式更加简洁,不是吗?

补充:

引用是直接访问,而指针是间接访问,故将指针作为函数参数的接收方式称间接引用,而把外号作为接收参数的方式称直接引用方式。


4、按地址传递、按引用传递的应用

由于这两种传参方式直接改变了主程序中变量的原值,因此可以看做是调用函数后返回了多个值,即这些被修改的变量都可以看做是被该函数返回的值。例如:

#include <iostream>
using namespace std;
int fun(int a, int &b, int &c)
{
	if(a>100)
	{
		a=1;
	}
	else
	{
		b=a*a;
		c=a*4;
		a=0;
	}
	return a;
}
int main()
{
	cout<<"本程序用于计算正方形面积和周长,请输入边长,表超过100"<<endl;
	int check;
	int a,b,c;
	cin>>a;
	check=fun(a,b,c);
	if(check)
	{
		cout<<"2b,输入数字超范围了"<<endl;
	}
	else
	{
		cout<<"面积为:"<<b<<endl;
		cout<<"周长为:"<<c<<endl;
	}
	return 0;
}

输出结果:



分析:

注意,在这个程序中,fun函数本来有一个返回值a,它的值赋给check,可决定输出哪个语句,即据此判断输入的边长是否大于100,而函数中的b和c由于按别名的方式传参,使得主函数中的b和c的值也发生了改变,因此b和c也可以看做是函数fun的另外两个返回值,即实现了函数返回多值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值