作为一个刚入职一年的小白,每次遇到函数传参问题都存在一定疑惑,这次总结整理一下。
在网上也看了那么多文档,咱也沿用网上最经典的例子,交换函数:交换两个参数的值,来分析比较一下实参和形参值是否改变。
首先,刚才提到了形参和实参,最基本的术语,实参和形参大家得了解吧:
- 形参:形参是功能函数里的变量,只有被调用的时候才分配内存单元,调用结束后立即释放内存,只在函数内部有效。
- 实参:也就是实际要拷贝给形参的参数,可以是常量,变量,等,但不管是什么类型,必须具有确定的值,注意并保证实参的个数,类型应与形参一一对应。
接下来到了重点:
函数传参有三种方式:值传递,地址传递,引用传递(应注意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;
}
分析:调用参数的时候,a和b作为实参拷贝给m和n,这时无论m和n怎么操作,都不会影响到实参的值,函数内部的操作不会影响到外部。
那么调用函数怎么会导致实参也发生改变呢?以下是第二种传参方式:地址传递:
分析:地址传递与值传递不同的是,地址传递是把实参的地址传给形参,这样形参和实参指向的是同一个地址,指针所指向地址的值就会发生相同变化。
注意:如果在函数中是使用指针变量来交换值,结果实参的值并没有改变。看以下代码。
分析:只是交换了形参的地址,并没有去改变地址对应变量的值。
分析:引用传递是以引用为参数,方便了函数操作,可以说是特殊的指针操作,和地址传递效果是一样的,同样也会改变实参的值。引用作为实参的别名,和实参是同一个变量。
以上都是个人理解,如有错误之处欢迎大家指出,今天的分享就到此为止,求点赞!