欢迎光临
我们一直在努力

搞懂函数传参:值传递、指针传递、引用传递原理

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) ❌ 不开新内存,别名 ✅ 可以

    希望可以帮助到大家,感谢观看,如果觉得文章对你有帮助的话,请点赞收藏关注支持一下博主😍,如有不足请指点,我及时改正!👻一起加油!嘻嘻😜

    赞(0)
    未经允许不得转载:171主机测评 » 搞懂函数传参:值传递、指针传递、引用传递原理
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址