关于值传递与指针传递

最近在写数据结构的实验,被要求用c语言来实现,突然被函数的值传递和地址传递给绕进去了,究竟什么时候传入的参数会因函数中的操作而被改变,值传递和地址传递的本质又是什么。

恰好最近在学计算机组成原理的体系结构,对函数传递的原理有了一些了解,特在此总结归纳一下。

  1. 值传递

值传递是指调用函数传入被调用函数的是实参的copy,也即函数中的操作不会对原本的实参值产生影响。

          2.地址传递

地址传递传入的是一个指针,其本质也是值传递,也即将该指针的copy传入,那就意味着该指针是不会发生变化的,函数中的操作不会对指针的指向产生影响。

不同的是,函数可以通过该指针修改所指地址上的值。

       3.底层原理

在32位Mips体系结构中,函数调用的过程主要是由jal指令和jr指令完成。

在被调用函数中,jal指令完成1.跳转至目标指令;2.将下一条指令的地址存入$ra(专门用来放置返回地址的寄存器)

在调用函数中,当用到传入的实参时,系统会将受保护的寄存器中的值压入memory中的一段栈空间中,在执行完所有指令后,再将值从栈空间中取出,重新lw给原本的寄存器,并将栈空间释放。返回值会被存到专门的寄存器$v1-$v2(只有一个返回值,两个寄存器是为了存double这样的64位数)中。

 

 

这样就很好理解为什么值传递不会对实参产生影响。

 

至于要修改指针指向就可以考虑用指针的指针。反正就是套娃,只要你有地址,就能操作他。

posted @ 2021-11-23 21:41  legolas-PRC  阅读(104)  评论(0编辑  收藏  举报