值传递和引用传递传的到底是啥CSDN

北京治疗酒渣鼻医院 http://pf.39.net/bdfyy/bdfhl/210721/9212612.html

作者

编程指北责编

张文

在网上看到过很多讨论Java、C++、Python是值传递还是引用传递这类文章,所以这一篇呢就是想从原理讲明白关于函数参数传递的几种形式。

参数传递无外乎就是传值(passbyvalue),传引用(passbyreference)或者说是传指针。

传值还是传引用可能在Java、Python这种语言中常常会困扰一些初学者,但是如果你有C/C++背景的话,那这个理解起来就是soeasy。

今天我就从C语言出发,一次性把Java、Python这些都给大家讲明白。

不过呀,要想彻底搞懂这个,需要了解两个背景知识:

堆、栈函数调用栈

堆、栈

要注意,这“堆”和“栈”并不是数据结构意义上的堆(Heap,一个可看成完全二叉树的数组对象)和栈(Stack,先进后出的线性结构)。

这里说的堆栈是指内存的两种组织形式,堆是指动态分配内存的一块区域,一般由程序员手动分配,比如Java中的new、C/C++中的malloc等,都是将创建的对象或者内存块放置在堆区。

而栈是则是由编译器自动分配释放(大概就是你申明一个变量就分配一块相应大小的内存),用于存放函数的参数值,局部变量等。

就拿Java来说吧,基本类型(int、double、long这种)是直接将存储在栈上的,而引用类型(类)则是值存储在堆上,栈上只存储一个对对象的引用。

举个栗子:

intage=22;Stringname=newString(shuaibei);

这两个变量存储图如下:

如果,我们分别对age、name变量赋值,会发生什么呢?

age=18;name=newString(xiaobei);

如下图:

age仅仅是将栈上的值修改为18,而name由于是String引用类型,所以会重新创建一个String对象,并且修改name,让其指向新的堆对象。(细心的话,你会发现,图中name执行的地址我做了修改)

然后,之前那个对象如果没有其它变量引用的话,就会被垃圾回收器回收掉。

这里也要注意一点,我创建String的时候,使用的是new,如果直接采用字符串赋值,比如:

Stringname=shuaibei

那么是会放到JVM的常量池去,不会被回收掉,这是字符串两种创建对象的区别,不过这里我们不


转载请注明:http://www.aierlanlan.com/grrz/3197.html

  • 上一篇文章:
  •   
  • 下一篇文章: