转自: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 由于传引用使用的是原本实参的地址,所以对引用参数值的修改,会在退出函数后体现在主调函数中,而传值调用对参数的修改不会影响到主调函数。
文章来源: 函数传参的三种方式