值传递、引用传递与地址传递对比

来源:互联网 发布:小智的淘宝店 编辑:程序博客网 时间:2024/06/13 01:29

研究问题

  1. 引用传递:形参与实参公用一个内存单元,同时变化。
  2. 值传递:形参是实参的克隆体,形参在内存单元中发生变化不会影响到实参。
  3. 形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的。
  4. 内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量。
  5. 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值。
  6. 通过地址传递,实参的值不发生变化,调用函数后,形参的值发生变化。

要点

  • 值传递
#include<stdio.h> void Exchg1(int x, int y)   //定义中的x,y变量被称为Exchg1函数的形式参数{int tmp;tmp=x;x=y;y=tmp;printf("x=%d,y=%d\n",x,y);}int main(){  int a=4,b=6;  Exchg1(a,b);     //a,b变量为Exchg1函数的实际参数。  printf("a=%d,b=%d\n",a,b);}

  值传递是对实参开辟的内存空间形成的副本操作,不影响实参值的改变。
- 地址传递

#include<stdio.h> void Exchg2(int *px, int *py){  int tmp=*px;  *px=*py;  *py=tmp;  printf("*px=%d,*py=%d\n",*px,*py);//px,py指向的,即a,b交换后的值   printf("px=%p,py=%p\n",&px,&py);//px,py的地址 }int main(){  int a=4;  int b=6;      Exchg2(&a,&b);      printf("a=%d,b=%d\n", a, b);}

  地址传递中主调函数传入的是实参的地址,被调函数通过指针实现寻址操作,同时操作改变实参形参的值。
- 引用传递

#include<stdio.h> void Exchg3(int &x, int &y) //注意定义处的形式参数的格式与值传递不同{   int tmp=x;   x=y;   y=tmp;   printf("x=%d,y=%d\n",x,y);}int main(){  int a=4;  int b=6;      Exchg3(a,b);  //注意:这里调用方式与值传递一样      printf("a=%d,b=%d\n", a, b);}

  引用传递中被调函数的形参是主调函数的实参的引用,属于同一个东西,不分彼此,改变形参就是改变实参。
- 对比与总结
1. 在函数定义格式上有不同:
值传递在定义处是:Exchg1(int x, int y);
引用传递在这义处是:Exchg1(int &x, int &y);
2. 调用时有相同的格式:
值传递:Exchg1(a,b);
引用传递:Exchg3(a,b);
3. 功能上是不同的:
值传递的函数里操作的不是a,b变量本身,只是将a,b值赋给了x,y函数里操作的只是x,y变量而不是a,b,显示a,b的值不会被Exchg1函数所修改。
引用传递Exchg3(a,b)函数里是用a,b分别代替了x,y。函数里操作的是a,b。

0 0