调用函数和被调用函数之间的参数传递是通过啥来传的

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了调用函数和被调用函数之间的参数传递是通过啥来传的相关的知识,希望对你有一定的参考价值。

是通过堆栈来传递,但调用函数不是通过出栈来取实参的,而是通过堆栈BP指针加偏移量
来取参数的,你注意观察反汇编指令就很容易理解了。
参考技术A 举例说明:
函数int fun(int a,int b) return a+b;,调用int x,y; x=5; y=fun(x,90);
在执行到函数调用语句时,系统先将第2个参数90压入堆栈,然后取出存放在变量x中的数值,压入堆栈,保存现场,转fun程序运行,在fun程序开始,将先压入堆栈的数当成变量b,然后将堆栈中第1个参数当做变量a,在fun程序中使用。在执行完fun函数后,计算a+b的值,取出放到特殊寄存器中当做函数返回值,利用堆栈中保存的现场数据,返回调用程序的调用点,舍弃堆栈中的现场数据、调用时压入的参数,并将寄存器中的数值赋值给变量y。

Java中的参数传递

实参与形参

  1. 形式参数:是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数。
  2. 实际参数:在调用有参函数时,主调函数和被调函数之间有数据传递关系。在主调函数中调用一个函数时,函数名后面括号中的参数称为“实际参数”。
  3. 实际参数是调用有参方法的时候真正传递的内容,而形式参数是用于接收实参内容的参数。

值传递和引用传递

  1. 值传递(pass by value):是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
  2. 引用传递(pass by reference):是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

传共享对象调用(共享对象传递)

  传共享对象调用中,先获取到实际参数的地址,然后将其复制,并把该地址的拷贝传递给被调函数的形式参数。因为参数的地址都指向同一个对象,所以我们也称之为"传共享对象",所以,如果在被调函数中改变了形式参数的值,调用者是可以看到这种变化的。

Java中参数传递

  1. 基本数据类型使用值传递
  2. 对象传递,把对象的引用当做值传递给方法,即共享对象传递
  3. Java对象的传递,是通过复制的方式把引用关系传递了,如果我们没有改引用关系,而是找到引用的地址,把里面的内容改了,是会对调用方有影响的,因为大家指向的是同一个共享对象。
  4. Java的对象传递,如果是修改引用,是不会对原来的对象有任何影响的,但是如果直接修改共享对象的属性的值,是会对原来的对象有影响的。

以上是关于调用函数和被调用函数之间的参数传递是通过啥来传的的主要内容,如果未能解决你的问题,请参考以下文章

GNU gcc/ld - 使用在同一个目标文件中定义的调用者和被调用者包装对符号的调用

编程中argument啥意思?一定要准确..

c/c++值传递和引用传递

Python的函数参数传递

c++,类的对象作为形参时一定会调用复制构造函数吗?

函数名作为参数传递与回调函数