函数参数类型及选择

函数参数类型及选择

函数参数类型主要有:值、地址、引用

在main函数中调用其他函数时,会在栈里开辟一个空间,最开始入栈的是当前代码的下一行代码的地址,然后依次是形参、函数的局部变量、函数的代码段,当函数返回时,释放栈空间,最后出栈的是下一行代码的地址,又回到了main函数里函数开始的地方继续执行。但是为什么栈里的变量释放了,函数还能返回呢,这是因为编译器会生成一个临时变量用来存放函数的返回值。

1、值传递

先看一段代码:

#include <iostream>
using namespace std;
void Swap1(int x, int y) {
	int tmp;
	tmp = x;
	x = y;
	y = tmp;
	cout << "x=" << x << ", y=" << y << endl;
}
int main()
{
	int a = 5, b = 7;
	Swap1(a, b);
	cout << "a=" << a << ", b=" << b << endl;
	return 0;
}

上述输出结果为:

x=7, y=5
a=5, b=7

可以看到在main函数中虽然执行了一次Swap1(a,b); 但是在main函数中输出a和b时并没有发生交换,只是在Swap1中发生了交换。这就是实参a,b和形参x,y的区别。在调用Swap1函数的时候,Swap1函数实际上先完成了如下操作:int x = a; int y = b(隐式),即把实参a,b的值分别赋给了x,y。之后在Swap1函数体中进行的任何操作就和a,b没有任何关系了,所有a,b的值也不会发生任何改变。

2、地址传递

将以上代码做一简单修改:

#include <iostream>
using namespace std;
void Swap2(int *px, int * py) {
	int tmp;
	tmp = *px;
	*px = *py;
	*py = tmp;
	cout << "px=" << *px << ", py=" << *py << endl;
}
int main()
{
	int a = 5, b = 7;
	Swap2(&a, &b);
	cout << "a=" << a << ", b=" << b << endl;
	return 0;
}

程序输出结果为:

px=7, py=5
a=7, b=5

可以看到在第二个程序中两个数值发生了交换。与第一个程序中不同的是函数参数发生了变化,Swap2(int *px, int * py) 函数中的参数都是指针。而在main函数中调用的时候:Swap2(&a, &b);它将a和b的地址值传递给px和py。相当于执行了以下操作:int * px = &a;int * py = &b;严格的说还是相当于值传递,只是传递的是地址值。

3、引用传递

只在代码段一加两个&符号就变成了引用传递,即将Swap(int x, int y)函数变为Swap(int &x, int &y):

#include <iostream>
using namespace std;
void Swap3(int &x, int &y) {
	int tmp;
	tmp = x;
	x = y;
	y = tmp;
	cout << "x=" << x << ", y=" << y << endl;
}
int main()
{
	int a = 5, b = 7;
	Swap3(a, b);
	cout << "a=" << a << ", b=" << b << endl;
	return 0;
}

该运行结果如下:

x=7, y=5
a=7, b=5

可以看到也交换了两个数值,就是因为&的存在,使得在调用Swap3()函数的时候,将a、b分别用x,y代替(别名),也就是说x,y引用了a,b变量。

参考
https://blog.csdn.net/z3410218746/article/details/7506473?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_paycolumn_v3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_paycolumn_v3&utm_relevant_index=2

https://blog.csdn.net/clise_girl/article/details/52121002?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-4.queryctrv2&spm=1001.2101.3001.4242.3&utm_relevant_index=7

那么在C++中,函数的形参,什么时候使用引用?什么时候使用指针?什么时候使用按值传递?

1 对于使用传递的值而不做修改的函数

(1)数据对象较小,如内置数据类型或小型结构体,则按值传递

void func(int );

(2)数据对象是数组,则只能使用指针,并将指针const指针

void func(const int *,int);//第二个参数为数组长度

(3)数据对象是较大的结构体,则const指针或const引用都行

struct struc{…};

void func(const struc *);

或void func(const struc &);

(4)数据对象是类,则使用const引用

void func(const string &,);

2 对于使用传递的值要做修改的函数

(1)数据对象是内置数据类型,则使用指针

void func(int *);

(2)数据对象是数组,则只能使用指针

void func(int *,int);//第二个参数为数组长度

(3)数据对象是结构体,则使用引用或指针

struct struc{…};

void func(struc *);

或void func(struc &);

(3)数据对象是类,则使用引用

void func(ostream &);
转自https://www.cnblogs.com/LiuFarrell/p/8934038.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值