怎么工作 编程里引用和内存是什么
程序运行时,我们创建的值一定得放在某个地方。那个地方就是内存。想象一面排满带编号储物柜的长墙,名字标签就是指向其中某一格的纸条。
值总得放在某处
程序运行的整个过程中,所有的值都会在内存里占一个位置。
内存就像一面排满带编号储物柜的墙。
每创建一个值,它就塞进一个空格,程序用“几号格”来记住它。
按“放入值”,值就会进入一个空格,并显示格子的编号。
每个值都有了自己的格子和编号。
可是在代码里,我们不写“7号格”,而是用'a'、“分数”这样的名字。
那么,名字和格子的编号是怎样连起来的?
名字标签指向位置
名字不是值本身,而是一张知道“是哪一格”的纸条。
名字 'a' → 3号格 → 里面的7。
所以一用'a',程序就顺着纸条找到3号格,打开读出7。这就是“指向”的意思。
按“沿着a走”,就会顺着纸条走到格子,取出里面的值。
名字指向格子,格子里装着值。
这张指向的纸条叫作引用。
从这里开始才是真正重要的地方。说“把a也给b”,会发生什么?
小的值会被复制
把数字这样的小值给b,这个值就会原样复制到一个新格子里。
现在a在3号格,b在5号格,是两个不同的格子。
所以就算把a改成9,b还是7。两者各有自己的值,互不相干。
按“复制到b”,再按“改a”,b在另一个格子,所以不会变。
复制出来的小值互不影响,干净利落。
可像对象这样的大东西就不同了,因为把大东西整个复制一遍很费劲。
所以通常会发生复制以外的事。
大东西一起指向同一个位置
把对象给b时,通常不会复制整个对象,而是让b也指向同一个格子。
现在a和b两张纸条,一起指着同一个格子。
所以通过a修改那个对象,通过b去看也一样变了。一个东西有两个名字嘛。
两个名字指着同一个格子,改一个,两个都变。
这是刚学编程时最常让人吃惊的地方:“我明明没碰b,它怎么变了?”
现在你知道答案了:它们指着同一个格子。
知道指向什么,就不会再糊涂
糊涂的根源永远只有一个。
名字是有自己的副本,还是和别的名字一起指着同一个东西?
小的值是复制,各走各的;大的东西指着同一个位置,一起变。
只要记住这个区别,就不会再吃惊了。
选“小的值”或“大的东西”,让它做同样的事,结果就分开了。
到这里,就是编程的基础了。
从一个值出发,我们打包、重复、起名、用对象归拢、用调试修好,再让机器运行起来。
现在连这一切放在哪里、名字指向什么也看明白了,扎实的基础就打好了。