值传递、引用传递与地址传递对比
来源:互联网 发布:小智的淘宝店 编辑:程序博客网 时间:2024/06/13 01:29
研究问题
- 引用传递:形参与实参公用一个内存单元,同时变化。
- 值传递:形参是实参的克隆体,形参在内存单元中发生变化不会影响到实参。
- 形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的。
- 内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量。
- 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值。
- 通过地址传递,实参的值不发生变化,调用函数后,形参的值发生变化。
要点
- 值传递
#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
- 值传递、引用传递与地址传递对比
- 值传递,地址传递与引用传递
- 值传递、地址传递与引用传递的使用
- C 值传递、地址传递、引用传递
- 值传递,地址传递,引用传递
- c++值传递、地址传递、引用传递
- 值传递、地址传递,引用传递
- 值传递,地址传递和引用传递
- 值传递,地址传递,引用传递
- 值传递、引用传递、地址传递辨析
- C++ 函数参数传递 值传递,引用传递,地址传递
- 值传递与引用传递
- 值传递与引用传递
- 值传递与引用传递
- 值传递与引用传递
- 值传递与引用传递
- 值传递与引用传递
- 引用传递与值传递
- PAT BASIC LEVEL 1002.写出这个数 (20)
- RecyclerView的使用
- 在linux操作系统下如何用指令配置jdk的环境变量
- java的单例模式
- cacheline pagecache buffercache
- 值传递、引用传递与地址传递对比
- 人工手动冷备与热备
- 个人记录-LeetCode 75. Sort Colors
- thread类使用笔记
- PAT 乙级 1042. 字符统计(20)
- 使用VC的时候,在VC98文件夹里的 Include 文件下添加头文件!!!
- 关于__vectorcall的使用
- html行内元素与块级元素
- emqttd介绍和集群安装【转】