C++中传值、传址与传引用的区别
来源:互联网 发布:爱知世博会logo涵义 编辑:程序博客网 时间:2024/05/16 17:19
1、参数传递的概念
所谓参数传递就是用函数调用所给出的实参(实际参数)向函数定义所给出的形参(形式参数)设置初始值的过程。
在c++中,调用函数时有三种参数传递方式,分别为:
(1)传值调用;
(2)传址调用(即是传指针);
(3)传引用;
总体上参数传递可以分为两类,由形参的类别决定:值调用与引用调用。除了定义为引用类型的形参外,其他类型的形参都是对应着值调用。指针传递也是值调用,只是它是值传递的是地址。下面对这三种参数传递方式进行详细的说明:
值传递:
值传递时,实参被拷贝了一份,然后在函数体内使用,函数体内修改参数变量时修改的只是实参的一份拷贝,而实参本身没有改变,所以如果想要在调用的函数中修改实参的值,使用值传递不能达到其目的,这时只能使用引用或者指针传递。下面代码可以说明:
voidswap(inta,intb) //此时传递的实参i与j的值在这里只是一份拷贝,交换的是他们的拷贝的值,而不是实参本身,出了这个函数的作用域之后,他们的拷贝值被销毁,因此i与j的值根本就没有交换。
{
inttemp = 0;
temp =a;
a=b;
b= temp;
}
intmain()
{
voidswap(int,int);
inti = 10;
intj = 20;
swap(i, j);
cout <<"i="<< i << endl;
cout <<"j="<< j << endl;
system("pause");
return0;
}
引用传递:
intmain()
{
voidswap(int&,int&);
inti = 10;
intj = 20;
swap(i, j);
return0;
}
voidswap(int&a,int&b)
{
inttemp;
temp =a;
a=b;
b= temp;
}
下面是此段代码的汇编代码:
int main()
{
00824410 push ebp
00824411 mov ebp,esp
00824413 sub esp,0DCh
00824419 push ebx
0082441A push esi
0082441B push edi
0082441C lea edi,[ebp-0DCh]
00824422 mov ecx,37h
00824427 mov eax,0CCCCCCCCh
0082442C rep stos dword ptr es:[edi]
0082442E mov eax,dword ptr ds:[0082F000h]
00824433 xor eax,ebp
00824435 mov dword ptr [ebp-4],eax
void swap(int &, int &);
int i = 10;
00824438 mov dword ptr [i],0Ah
int j = 20;
0082443F mov dword ptr [j],14h
swap(i, j);
00824446 lea eax,[j]
00824449 push eax
0082444A lea ecx,[i]
0082444D push ecx
0082444E call swap (08214A1h)
00824453 add esp,8
0 0
- C++-传值与传引用的区别
- 【c++】函数参数传值与传引用的区别
- PHP中传值与传引用的区别
- php中传值与传引用的区别
- php中传值与传引用的区别
- PHP中传值与传引用的区别
- php中传值与传引用的区别?
- php中传值与传引用的区别?
- 传值、传址与引用的区别
- C++中传值、传址与传引用的区别
- 【C/C++】指针与引用的区别
- 指针与引用的区别 (MoreEffictive C++)
- C/C++ 指针与引用的区别
- 【C++】指针与引用的区别
- 引用 与 指针的区别 -- C
- C语言---指针与引用的区别
- C中指针与引用的区别
- C/C++ 指针与引用的区别
- 使用Spring MVC的@ControllerAdvice注解做Json的异常处理
- 【步兵 cocos2dx】texturePacker命令行
- 最详细的Log4j使用教程
- Oblique View Frustum
- 适配器模式——得心应手的“粘合剂”
- C++中传值、传址与传引用的区别
- 安天发布《DDOS攻击之鬼影DDOS家族分析》
- MemCache
- Missing assembly: DevExpress.XtraPrinting.v11.2.
- CodeForces 213C Relay Race(dp)
- ST算法学习——POJ3264
- 解决org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):
- quartz基础知识
- poj1094 Sorting It All Out (拓扑排序)