函数传参的三种方式

匿名 (未验证) 提交于 2019-12-03 00:22:01

转自:https://blog.csdn.net/qq_39539470/article/details/79519156

感谢原创作者!

函数传参有三种传参方式:传值、传址、传引用。

1、按值传递

(2)形参的存储空间是函数被调用时才分配的,调用开始,系统为形参开辟一个临时的存储区,然后将各实参传递给形参,这是形参就得到了实参的值。
#include<stdio.h> void swap1(int x, int y)//定义中的x,y变量是swap函数的两个形参 {     int tmp;     tmp = x;     x = y;     y = tmp;     printf("x=%d,y=%d\n", x, y); } int main() {     int a = 2;     int b = 3;     swap1(a, b);//a,b变量为swap函数的实际参数     printf("a=%d,b=%d", a, b);     return 0; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17


代码分析









main函数中调用了swap函数;swap中包含了以下代码

int x=a; int y=b;/*前两行代码是函数的隐含操作不可写在代码之中, 是为了方便大家理解我自己加上的*/ int tmp;     tmp = x;     x = y;     y = tmp;     printf("x=%d,y=%d\n", x, y);     ```  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11


2、地址传递

示例代码:

 void swap2(int *px, int *py) {     int tmp;     tmp = *px;     *px = *py;     *py = tmp;     printf("px=%d,py=%d\n", *px, *py); } int main() {     int a = 2;     int b = 3;     swap2(&a, &b);/*调用了swap函数,同样也有隐含动作px=&a;py=&b;*/     printf("a=%d,b=%d", a, b);     return 0; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17



3、引用传递

代码示例:

#include<stdio.h> void  swap3(int &x,int &y) {     int tmp = x;     x = y;     y = tmp;     printf("x=%d,y=%d\n", x, y); } int main() {     int a = 2;     int b = 3;     swap3(a, b);//调用方式与传值一样     printf("a=%d,b=%d", a, b);     system("pause");     return 0; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17


代码分析:我们看到该代码只与传值中swap函数定义不同,swap3中参数都加了取地址符号&,有了这个函数会将a,b分别替代了x,y,这样函数里面操作就是a,b本身了。

4、对于值传递和引用传递的比较:






3 由于传引用使用的是原本实参的地址,所以对引用参数值的修改,会在退出函数后体现在主调函数中,而传值调用对参数的修改不会影响到主调函数。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!