C++ 函数参数传递
来源:互联网 发布:入门鼠标推荐 知乎 编辑:程序博客网 时间:2024/06/05 02:27
值 传递
当初始化一个非引用类型的变量时,初始值被拷贝给变量。此时,对变量的改动不会影响初始值:
int n = 0;int i = n;u = 42; //i的值改变,n的值不会变
函数传值参数的机理完全一样。函数对形参做的所有操作都不会影响到实参。
指针 传递
拷贝的是指针的值,拷贝之后,两个指针是不同的指针。
void reset(int *ip){ *ip = 0; //改变了指针ip所指对象的值 ip = 0; //只改变了ip的局部拷贝,实参未被改变}
引用 传递
会议过去所学的知识,我们知道对于引用的操作实际上是作用在引用所引的对象上:
int n = 0, i = 42;int &r = n; //r绑定了n(即r是n的另一个名字)r = 42; //现在n的值是42r = i; //现在n的值和i相同i = r; //现在i的值和n相同
和其他引用一样,引用形参绑定了初始化它的对象。通过使用引用形参,允许函数改变一个或多个实参的值。所以可以使用引用避免拷贝,使用引用形参返回额外的信息。
void reset(int &i){ i = 0; //改了i所引对象的值}
emmm?
形参相当于是实参的“别名”,对形参的操作其实就是对实参的操作,在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。
我抄的:
int a = 10;int & r = a;cout << &a << endl;cout << &r << endl;从上面的例子当中可以看出:它们得出的结果是相同的,这时便会有人说,r和a所占用的内存空间是相同的,因为打印出来的地址是相同的。所以这些教材上对于引用变量的操作,称之为声明一个引用变量,而非定义。因为教材的编写者认为引用变量并不占用空间。但是,如果你使用调试器调试一下,看一下汇编的代码,就会产生新的迷惑了。00401040 push ebp00401041 mov ebp,esp00401043 sub esp,48h00401046 push ebx00401047 push esi00401048 push edi00401049 lea edi,[ebp-48h]0040104C mov ecx,12h00401051 mov eax,0CCCCCCCCh00401056 rep stos dword ptr [edi]5: int a = 10;00401058 mov dword ptr [ebp-4],0Ah6: int & r = a;0040105F lea eax,[ebp-4]00401062 mov dword ptr [ebp-8],eax从这段汇编代码来看,r和a的空间并不相同,那这又怎么解释呢?基于此,我得出了一个非常合理的解释:如果定义(我认为引用变量占用空间,故称之为定义)一个引用变量,这个时候引用变量实际上在内存中已经申请了一个空间,是4个字节的(32bit系统中),它本身和指针是相同的。也就是说引用和指针对于编译器本身来说操作是相同的,只是对于用户来说操作不同而已。
阅读全文
0 0
- C函数参数传递
- C函数参数传递
- c函数的参数传递
- C函数的参数传递
- C语言函数参数传递
- c#-函数的参数传递
- c语言函数参数传递
- C#-函数参数的传递
- C 函数指针 参数传递
- C/C++:函数参数传递方式
- 函数参数传递方式(c/c++)
- C中函数传递参数原理:值传递, 指针传递?
- C中函数传递参数原理:值传递, 指针传递?
- C/C++中的函数参数传递机制
- C/C++中的函数参数传递机制
- C/C++中的函数参数传递机制
- C/C++中的函数参数传递机制
- C/C++中的函数参数传递机制
- Linux下文件的三种时间戳
- 使用ffmpeg接口将YUV编码为h.264
- HDU 5147 Sequence II 枚举+树状数组
- hadoop-企业版环境搭建(四)-安装HBase
- C++一本通题库1017
- C++ 函数参数传递
- Hdu 3938 Portal【离线+并查集+思维】
- C++一本通题库1018
- Alluxio使用场景
- 斐波那契数列变形之青蛙跳台阶
- 【Linux】软件安装
- HTML5 Storage JSON
- C
- IDEA构建Hive的UDF函数