关于变量的思考

1 链表

困难操作:

反转链表

反转链表(图解,易懂)_July yi的博客-CSDN博客

关于变量的一种可能思考:

当我们说我们的变量的时候,我们经常会有一种比喻,那就是变量是一个盒子,这种比喻对于我们理解变量,尤其是理解面向对象语言中的引用式变量有着极大的阻碍,我们知道,当我们说我们的变量是一个盒子的时候,我们其实是再说,变量其实包住了一个值,通过这种包裹,我们实现了很多很有意思的操作,可是现在,我们应该想到的是,变量不是那个盒子,而是一个附加在那个对象上的标注,而且这样的想法,理论上来说也并不只是对于对象来说的,下面就有我来说道说道:

这里边最核心的问题,首先,我们提取一下,那就是,到底一个东西被两个变量所标注,换句话说,当一个苹果被两个盒子包住了,如果苹果可以随时更换了,那么每一个盒子面对的还是同样的苹果吗,

好吧,语言是如此的苍白无力,我企图用例子进行形象化处理

int a=c;

int b=c;

c---->变了

a和b对应的还是同样的东西吗

答案是,是的

a和b显然都是那个该死的水果的附属品,虽然但是,他们对的确实是同一个盒子

如果是链表呢?

现在我们看这个东西:

0->1->-2->3

a->0;

b->0;

其中一个我们来思考的问题是,当然这可能有些跑题了,比方说我们来思考一个问题,a = a->next,真是一个十分有意思的东西,我们改变a,但是我们却使用了a,这相当于是什么呢,我们可以认为这是斗破苍穹里边的那个异火,什么是异火呢,很有意思,如果我想升级,我必须先利用我自己找到另一个异火,然后我还要把我自己这个异火和我找到的新的异火升级,最后我就一直升级,但是有一个很有意思的东西a确实变为了下一个a,异火确实升级成了新的异火,可是这和我异水又有什么关系呢,我异水只是和你异火找到了同一个东西,这玩意是异水异火都可以融合,可是你异火升级了,我异水还是得按照原来的东西找,为什么,这和原来的区别在哪里:

很简单,你找的东西会不会变,如果你们两个都罩住了水果,水果自己当然可以变化,它变了我们自然也就跟着变,可是如果你找的东西是不会变的,我承认,你异火吞了之后自己升级了,可是这跟我异水有什么关系,我异水照样还得按照自己的实力找下一个等级的异火(水),我是没有变的,因为你升级的不是你找的东西这个共同体,而是你这个异火本身这个独特的变量,这样想来故事似乎也变得简单了呢。

而在《流畅的python》这本书中,更是给出了一个绝妙的比喻,那就是变量并不是盒子,而是便利贴,我们不是负责安装你的,而是给你贴一个标签罢了,所以,忘了盒子把!!!

这样的话,我们的比喻甚至可以改变,我们只是把一个便利贴贴在了书的一页,正因为有了这一页,我们可以找到下一页,因此,我们变把便利贴贴在了下一页,那又怎样,原本的书中的那一页的另一个便利贴又怎么会受到影响呢!~

其实我们还可以再往深了想一想,链表是有所谓的经典操作的:我们且看他一看:

a= a -> next

这是让a转移到下一个节点

a->next = a

这是让a指向他自己

区别又在哪里呢,所谓好事多磨,让自己进化了,这便是让自己变为下一个自己

而反之呢,让自己退化了,便只能是自己变为自己了,这是因为历史是一个圈了

这当真是因为a->next既是那条线,又是那条线所指的那个人,也就是说,我们的关系,既可以说是线的关系,也可以说是节点的关系

不知道大家有没有画过流程图,当我们将两个流程节点连接的时候,我们说a的下一个节点,当我们没有连接的时候,自然指的是那条线,那条线,是我们的选择,但是一旦已经连接了,流程图中自然便是我们的结果,也就是说,本质上不过是常量和变量的区别罢了

还有一种可能就是,当赋值的时候,我们是把左边的标签贴到右边的东西上

与之对应,链表中就是让左边的那条线,指向右边,唯一不同的是,这次的右边,

是一种超越时空的东西,不会受到将来的自己的因果的影响

至于有的时候我们使用链表时,会有一个疑问我们到底要不要把一条线和一个节点的关系断开呢,关键在于,是不是我们还有别的方式,不论是那种方式,只要一直连线,最后可以回到我们断开的那个节点上,就行了,我去,这不就是连连看吗!

以上自然是普通方法,但是若是我们还有一种情况,阁下又该如何应对呢:自然,上述中是两个东西指向了同一个东西,这样的思考是有效的,可若是不止如此呢。

比方说a=c; b=c 现在若是令a=0了,那么b会受影响吗,不会,因为b和a只是标签,你改变了标签,又怎么会改变水果呢,只是你把标签拿走了

可是若是b=c a=b呢,那就会了,因为你让c变了,b这个标签变了,a这个标签指向的时b,a自然也会改变了,所以关键是,变得到底是我们共同的信仰,还是标签这个东西本身

也就是说,赋值就是贴标签,如果你是a=b,又让a=c了,不过是换一个标签,可是如果a=b ,c=b了,b = c了就是换水果了,大家都要变。

这一下,让我想清了一个东西

比方说:

a---->b

c----->b

现在我让a->next变为了NULL

现在再看这个

a = b

c = b

现在我们厘清一下他们的区别,我让a->next变为了NULL,因为a和c都指向了b,而a->next就是b本身,这俩是一个东西,所以可以说改变的是b,因此b变了,a和c自然都变了

而a=b, c=b中a和c只是便利贴,他们是没办法粘上去了,可是却不能顺着他找到他,而a-->b中的a不只是便利贴,还是别的呢,其实是一个电子书签,它不仅说明了自己是一个书签,还告诉我们你点我就可以自动跳转到对应的页了,可是便利贴不行,你点他它没法跳转,因此我们通过书签可以改变可以影响最后的内容,可是通过修改便利贴我们做不到修改最后的内容。

这就是值变化和地址变化最大的不同了吧,那就是他们两个到底是不是同一个地址。

a=b,c=b是两个东西指向了一个地址,但是那个地址你没法通过ab获得!

a------>b c---->b 却是他们三个就是同一个地址

事实上我们的区别就是这样的a=b c=b 但是a和c是间接的,没法通过任何方法得到b,可若是a,c有一个元素是指针,通过指针a和b就可以访问c了,也就是说他们可以通过自己的方法来到c的住所,可是a=b和c=b中却不行,这就是为什么一个可以,另一个不可以。

好吧,二货如我,改主意了,不是什么通过间接方式可以得到,而是因为他俩就是地址,所以地址使者之间是可以相互吸引的,我可以得到地址,你得到的却只有值,没有地址!所以你不知道来自哪里

另外,本质上是因为,赋值的时候a=b

c=b b只是一个值,所以b的值变了,a和c指向的地址的值自然也就变了

a-->b c-->b b却是一个地址,地址变了,指向的下一个部分作为一个整体也就变了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值