从汇编的底层代码实现角度深入理解形参和实参
来源:互联网 发布:数据眼龙空 编辑:程序博客网 时间:2024/06/06 09:56
形参是在函数定义时给出的参数,实参是主调函数中调用某一个函数时给出的。
形参和实参的作用是实现主调函数与被调函数之间的数据传递,也就是我们通常所说的传参。
形参实际是实参在被调函数中的一份拷贝,调用时压入栈中,分配内存,当调用函数结束,内存就会释放,那一份拷贝随之释放。
从底层汇编代码来看,主调函数在调用另外一个函数的时候,会先将参数传入,调用函数是通过栈过程来实现的,被调函数把参数压入栈中新开辟的空间中,当调用结束,空间就会被释放。
下面是一个递归函数调用函数本身的汇编代码,首先是调用以前传参。
将传递过来的参数,压入新开辟的栈空间中。在调用结束后释放。
形参和实参都有各自的有效范围,实参只在主调函数中有效,形参只在被调函数中有效,所以无法通过修改形参来妄想修改主调函数的实参,从汇编的角度看,每一个函数都有自己的一个栈,实参是存在于主调函数的栈空间中,而形参是存在于被调函数的栈中,各自分配的内存地址是不同的。所以要想达到修改形参来修改实参的目的,方式就是通过传指针或者传引用,将实参的地址传递给形参,也就是对形参的改变也就是修改实参。
int i=10; 这里i是一个变量名,实际上从汇编的底层代码角度看,不存在变量名的概念,这里是在内存中分配一个int型的大小的空间来存放10,修改i的值,就会修改空间中的10的值,所以i对应的实际是内存的地址。所以就是修改内存中的内容的唯一方式就是通过内存的地址,因为底层中取的值就是通过地址获得的。
上面从汇编底层代码的角度看会很清晰的了解所有的过程,但是这些都是编译器做的事,高级语言给我们的这些都是透明的,给我们的感觉就是,形参和实参在内存中的地址不同,形参是实参的一份拷贝,形参在被调函数结束以后,就会被释放掉,从而实参不会受到影响,但是如果传递的是实参的地址,则在被调函数中使用的也是实参的地址,改变的将会实参本身。
接下来看一下形参与实参的几点区别:
1有效范围不同,实参只在主调函数中有效,形参只在被调函数内部有效,当被调函数结束以后不可以在使用。
2内存地址不同,形参只在被调用时才会分配内存,结束后会释放,不会对实参产生影响,除非是传递的是地址。
3实参在传递时必须是确定的值,可以是常量,变量,表达式,函数等,但是必须是确定的值。
4数据参数传递,只能是实参到形参单向传递。
5实参和形参在数量上,类型上,顺序上必须严格一致,否则类型不匹配错误。
- 从汇编的底层代码实现角度深入理解形参和实参
- 从汇编的角度理解为什么c样式函数使用时,实参尽量使用指针传递
- 深入理解实参和形参
- 从汇编和底层的角度看c和类c语言
- 形参和实参的理解练习
- 从程序员的角度深入理解MySQL
- 从汇编角度理解volatile
- 从底层汇编理解 c++ 引用实现机制
- ZT从底层汇编理解 c++ 引用实现机制
- 深入探讨this指针:从汇编的角度考虑
- 深入理解Lock的底层实现原理
- 如何从底层角度理解编程?
- 函数实参和形参(常见的错误理解)
- 关于函数形参和实参关系的理解
- 从汇编角度看c++的const实现
- 从底层原理深入理解 PHP 的引用 “&”
- 深入理解 MySQL 底层实现
- 从汇编的角度思考指针和引用
- 无法解析的外部符号 EVP_EncryptFinal_ex
- Unity3d iOS 内购详细流程总汇
- list_entry()详解
- 安装双系统win7+centos7后恢复win7引导
- Integer Inquiry 大数相加
- 从汇编的底层代码实现角度深入理解形参和实参
- 开源软件
- JavaScript-局部刷新
- Linux串口通信编程
- Office 2013使用技巧
- Android开发:SurfaceView基本用法总结及开发问题分享
- eclipse乱码解决方法
- 计划
- ARM板上挂载NFS文件系统