函数传参的三种方式

作为一个刚入职一年的小白,每次遇到函数传参问题都存在一定疑惑,这次总结整理一下。

在网上也看了那么多文档,咱也沿用网上最经典的例子,交换函数:交换两个参数的值,来分析比较一下实参和形参值是否改变。

首先,刚才提到了形参和实参,最基本的术语,实参和形参大家得了解吧:

  • 形参:形参是功能函数里的变量,只有被调用的时候才分配内存单元,调用结束后立即释放内存,只在函数内部有效。
  • 实参:也就是实际要拷贝给形参的参数,可以是常量,变量,等,但不管是什么类型,必须具有确定的值,注意并保证实参的个数,类型应与形参一一对应。

接下来到了重点:
函数传参有三种方式:值传递,地址传递,引用传递(应注意C语言没有引用)
引用作为变量的别名而存在是为了代替指针;————在后续的指针讲解中会有具体说明。

下面来看代码:

#include <iostream>
using namespace std;

void test01(int m, int n)
{
	int temp;
	cout << "之前m的值: " << m << "  地址:" << &m << endl;
	cout << "之前n的值: " << n << "  地址:" << &n << endl;
	temp = m;
	m = n;
	n = temp;
	cout << "之后m的值: " << m << "  地址:" << &m << endl;
	cout << "之后n的值: " << n << "  地址:" << &n << endl;
}

void test02(int *m, int *n)
{
	int temp;
	cout << "之前m的值: " << *m << "  地址:" << m << endl;
	cout << "之前n的值: " << *n << "  地址:" << n << endl;
	temp = *m;
	*m = *n;
	*n = temp;
	cout << "之后m的值: " << *m << "  地址:" << m << endl;
	cout << "之后n的值: " << *n << "  地址:" << n << endl;
}

void test03(int *m, int *n)
{
	int *temp;
	cout << "之前m的值: " << *m << "  地址:" << m << endl;
	cout << "之前n的值: " << *n << "  地址:" << n << endl;
	temp = m;
	m = n;
	n = temp;
	cout << "之后m的值: " << *m << "  地址:" << m << endl;
	cout << "之后n的值: " << *n << "  地址:" << n << endl;
}

void test04(int &m, int &n)
{
	int temp;
	cout << "之前m的值: " << m << "  地址:" << &m << endl;
	cout << "之前n的值: " << n << "  地址:" << &n << endl;
	temp = m;
	m = n;
	n = temp;
	cout << "之后m的值: " << m << "  地址:" << &m << endl;
	cout << "之后n的值: " << n << "  地址:" << &n << endl;
}

int main()
{
	int a, b;
	a = 1;
	b = 2;
	cout << "交换前a的值:" << a << "  地址a:" << &a << endl;
	cout << "交换前b的值:" << b << "  地址b:" << &b << endl;
	//test01(a, b);
	//test02(&a, &b);
	//test03(&a, &b);
	test04(a, b);
	cout << "交换后a的值:" << a << "  地址a:" << &a << endl;
	cout << "交换后b的值:" << b << "  地址b:" << &b << endl;
	return 0;
}

test01打印结果
分析:调用参数的时候,a和b作为实参拷贝给m和n,这时无论m和n怎么操作,都不会影响到实参的值,函数内部的操作不会影响到外部。

那么调用函数怎么会导致实参也发生改变呢?以下是第二种传参方式:地址传递:
test02打印结果
分析:地址传递与值传递不同的是,地址传递是把实参的地址传给形参,这样形参和实参指向的是同一个地址,指针所指向地址的值就会发生相同变化。

注意:如果在函数中是使用指针变量来交换值,结果实参的值并没有改变。看以下代码。
test03打印结果
分析:只是交换了形参的地址,并没有去改变地址对应变量的值。

test04打印结果
分析:引用传递是以引用为参数,方便了函数操作,可以说是特殊的指针操作,和地址传递效果是一样的,同样也会改变实参的值。引用作为实参的别名,和实参是同一个变量。

以上都是个人理解,如有错误之处欢迎大家指出,今天的分享就到此为止,求点赞!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值