4.3值传递⭐
特点:拷贝一份数据给形参,形参和外面变量互不干扰
在函数里面修改形参,完全不会影响 main 里面原来的变量
适用场景:只需要读取数据,不需要修改外面原始变量

因为change函数采用的是传值调用,只有在调用change函数时,编译器才会为其中的形式参数m和n以及变 量temp分配内存区域,并用实参x和y对形参n和m赋值,change函数中进行的数值交换是对n和m进行的 操作,并不会影响main函数中的x和y,而且,m、n及temp在change函数执行完毕后便会被撤销,所占 的内存区域被收回。调用函数和被调用函数发生的唯一数据关联就是由实参向形参赋值,此后,被调 函数中的变量(含形参)与调用函数中的变量便各有各的内存空间,互不干涉,即使变量名相同,也 会被编译器认为是不同的变量。

4.4指针传递⭐
想在函数内部修改外面的变量:传变量地址进去
形参写成指针 int *n
调用的时候取地址 change(&x, &y)
*n 等价于外面原来的变量,可以直接修改原值
-
原理:拷贝的是地址值,通过地址间接访问外面内存
-
缺点:写法麻烦,容易写错*和&
#include <iostream>
using namespace std;
void change(int*,int*);
int main()
{
int x=2,y=3;
cout<<"交换前:x="<<x<<",y="<<y<<endl;
change(&x,&y);
cout<<"交换后:x="<<x<<",y="<<y<<endl;
}
void change(int *n,int *m)
{
int temp;
temp=*n;
*n=*m;
*m=temp;
}


先看普通值传递版本: 如果 swap 函数形参是普通int a, int b,调用swap(x,y)的时候,会把 x 的值拷贝一份给 a、y 的值拷贝一份给 b。 a 和 b 是函数内部新开辟的独立局部变量,是副本,和外面原来的 x、y 完全是两块互不干扰的内存。 函数里面不管怎么交换 a、b,只改副本里的数据;函数结束,a、b 直接销毁,外面原始的 x、y 从头到尾一点没变。
而传指针版本:形参是int *n, int *m,调用的时候传进去的是&x、&y,也就是 x、y 的地址。 n、m 虽然也是函数里新建的局部指针变量(副本),但是它们存的是外面 x、y 的地址。 我们在函数内部用*n、*m,就是顺着地址,找到外面原始 x、y 的内存空间,直接修改原始内存里存放的数据。 所以交换操作作用到了原本的 x、y,函数结束之后,外面的 x、y 就真正交换成功了。
“很多同学在这里容易混淆:不管是普通形参,还是指针形参,形参本身全都是副本! 值传递拷贝的是数字;指针传递拷贝的是地址。 普通 swap:拿到数字副本,换副本,外面不动; 指针 swap:拿到原始变量的地址副本,顺着地址,找到外面真正的变量,修改它里面的值。
4.5引用传递⭐
引用 = 变量别名,形参就是实参本身,不单独开辟内存
-
写法:形参 int &n
-
调用的时候很干净:直接写 change(x,y);,不用写 &
-
特点:函数内对形参的修改,就是直接修改外面原始变量
#include <iostream>
using namespace std;
void change(int&,int&);
int main()
{
int x=2,y=3;
cout<<"变量x的地址是:"<<&x<<endl;
cout<<"交换前:x="<<x<<",y="<<y<<endl;
change(x,y);
cout<<"交换后:x="<<x<<",y="<<y<<endl;
}
void change(int& n,int& m)
{
int temp;
temp=n;
n=m;
m=temp;
cout<<"形参n的地址是:"<<&n<<endl;
}


| 值传递 | int n | change(x) | ✅ 新建拷贝 | ❌ 不能 |
| 指针传递 | int *n | change(&x) | ✅ 指针变量本身新建 | ✅ 可以(*n) |
| 引用传递 | int &n | change(x) | ❌ 不开新内存,别名 | ✅ 可以 |
希望可以帮助到大家,感谢观看,如果觉得文章对你有帮助的话,请点赞收藏关注支持一下博主😍,如有不足请指点,我及时改正!👻一起加油!嘻嘻😜



