从汇编的底层代码实现角度深入理解形参和实参

来源:互联网 发布:数据眼龙空 编辑:程序博客网 时间:2024/06/06 09:56

形参是在函数定义时给出的参数,实参是主调函数中调用某一个函数时给出的。

形参和实参的作用是实现主调函数与被调函数之间的数据传递,也就是我们通常所说的传参

形参实际是实参在被调函数中的一份拷贝,调用时压入栈中,分配内存,当调用函数结束,内存就会释放,那一份拷贝随之释放。

从底层汇编代码来看,主调函数在调用另外一个函数的时候,会先将参数传入,调用函数是通过栈过程来实现的,被调函数把参数压入栈中新开辟的空间中,当调用结束,空间就会被释放。

下面是一个递归函数调用函数本身的汇编代码,首先是调用以前传参。


将传递过来的参数,压入新开辟的栈空间中。在调用结束后释放。


形参和实参都有各自的有效范围,实参只在主调函数中有效,形参只在被调函数中有效,所以无法通过修改形参来妄想修改主调函数的实参,从汇编的角度看,每一个函数都有自己的一个栈,实参是存在于主调函数的栈空间中,而形参是存在于被调函数的栈中,各自分配的内存地址是不同的。所以要想达到修改形参来修改实参的目的,方式就是通过传指针或者传引用,将实参的地址传递给形参,也就是对形参的改变也就是修改实参。

int i=10; 这里i是一个变量名,实际上从汇编的底层代码角度看,不存在变量名的概念,这里是在内存中分配一个int型的大小的空间来存放10,修改i的值,就会修改空间中的10的值,所以i对应的实际是内存的地址。所以就是修改内存中的内容的唯一方式就是通过内存的地址,因为底层中取的值就是通过地址获得的

上面从汇编底层代码的角度看会很清晰的了解所有的过程,但是这些都是编译器做的事,高级语言给我们的这些都是透明的,给我们的感觉就是,形参和实参在内存中的地址不同,形参是实参的一份拷贝,形参在被调函数结束以后,就会被释放掉,从而实参不会受到影响,但是如果传递的是实参的地址,则在被调函数中使用的也是实参的地址,改变的将会实参本身。

接下来看一下形参与实参的几点区别:

1有效范围不同,实参只在主调函数中有效,形参只在被调函数内部有效,当被调函数结束以后不可以在使用。

2内存地址不同,形参只在被调用时才会分配内存,结束后会释放,不会对实参产生影响,除非是传递的是地址。

3实参在传递时必须是确定的值,可以是常量,变量,表达式,函数等,但是必须是确定的值。

4数据参数传递,只能是实参到形参单向传递

5实参和形参在数量上,类型上,顺序上必须严格一致,否则类型不匹配错误

0 0
原创粉丝点击