这是作者的第一个博客。作者一直使用Java行使算法并打开服务器技术堆栈以开发和学习,但是人们不如Heaven.fa Tong Wanfitong的信心。在学习几天后,发现与C/CPP程序员相比,Java程序员的学习成本仍然更大。特别是对于大多数Java背景,Go同事,指针,指针,指针,指针,Pointersit是第一个困难。
无需复杂的是,指针也是一个简单的变量,除了其值代表内存的某个地址,并且在此地址上可能还有其他变量或结构,这就是所有的。唯一的特殊是娃娃的逻辑:指针是一个变量,然后它也需要在内存中的地址存储它,这意味着指针也有指针。因此,由于指针的存在,任何变量都具有一个值的操作。:&var,指示变量所在的地址的值或变量的指针的值;对于指针变量,它具有额外的*ptr操作,以获取其代表的值,即相应地址body上的变量或结构。
在理解指针之后,我认为也许有Java程序员与我有相同的困惑。我使用Java使用此东西。在Java中无法直接执行的功能之一:
如代码所示,我想谈谈函数调用中变量i的值,但是每个人都知道输出结果我仍然是0。
至于原因,可以通过稍微阅读JVM八股来解释,如果我想满足我的需求,我必须返回计算的结果值并重新分配。相同的结果。
但是对于使用指针的程序员而言,他们不喜欢返回重新启动值的方式,但希望我们的功能调用是我们要移动的变量,而不是其副本(值传输结果),以及的结果复制品(值传输结果)。如何实现它?
这是使用指针,如下:
实际上,在经历了指针的作用之后,指针的作用与作业和参考文献有很大关系。
从Java开始时,仍在纪念Java基金会。实际上,Java法规非常简单明了:所有变量仅分为两种类型:简单类型和参考类型,分配值为值时简单类型,而参考类型为地址传输;
这与==操作完全相同:简单类型是值比较,参考类型地址比较,因此我们还必须熟悉两组代码之间的区别:
第二部分代码如果在堆栈框架上的本地变量表上的两个变量的值实际上是相同的地址值,则指向桩区域中唯一的数组。
如果您必须从Java考虑,您只能说没有人注意虚拟机堆栈中本地变量表的地址。
因此,总而言之,Java是相同的,无论是分配,比较还是函数调用。我们不怀疑这种代码的结果:
如果您认为这已经结束,那么麻烦才刚刚开始。话题,如果您这次用GO代码编写Java代码,您将奇怪地调用该功能修改数组的功能!
原因并不难找到:检查后,发现数组的Java定义(数组扩展了对象,因此数组是参考或对象),Go认为数组是值类型。
因此,我认为我可以使用指针来解决这一需求,就像操作的前部*ptr ++添加了一个。
它也失败了,因为它与以前的ptr ++不同。数组需要索引来修改值,并且ptr [0] = 0的操作甚至无法编译。
因此,使用新的数字将索引使用到*ptr?no,因为该值的值再次发生,因此基本上复制了数组,称为NUMS。因此,似乎无法修改函数调用中外部的内部数组。
在GO中,与数组非常相似的数据结构是切片,但是切片的本质是一种结构,即参考类型而不是类型,这意味着其变量不是切片本身,而是对此,或值,价值您可以找到切片本身的地址值。
因此,如果您想使用函数调用来修改切片,您甚至都不需要指针,并且直接修改是结构本身。
但是,这是否意味着通过两种类型的人参(复制)和参考传输(不是复制)的两种类型?
“,&切片以查看两个地址),但是两个具有相同的值,都指向相同的结构(&slice [0])。