看完这个,我彻底理解了Golang的指针

网站建设4年前发布
27 0 0

golang中一个非常鲜明的特点就是引入了指针的使用,这个在py、php、java中都是不支持的,但是很多读者都反馈说对指针不是很了解,所以今天写了这篇文章,当然我尽量用通俗的语言,希望对您有用。,想了解什么是指针,你先得了解数据是怎么取到的,上述代码非常简单,我相信不会golang的读者应该也能看懂。但是他底层究竟干嘛了?你真的了解过么?接下来咱们逐一解释,首先这一步,是给变量a,在内存中开辟了一块空间,因为是int类型,所以空间大小为4个字节,那么问题来了,「这块空间开在内存哪个位置?」 首先这块位置是系统「随机分配」的一块。另外给这块内存做了一个「标记」,方便下次找到,「这个标记就在这块内存的起始的位置」,接下来给变量a赋值为1。那么系统如何赋值的呢?首先总得找到a这块内存在哪吧?「如何找到给a分配的那块内存的呢?」当然是通过之前给a变量做的那个「标记」。通过标记找到这块内存所在的位置,然后直接在开辟好的内存空间存下给a赋值的数据就可以了。,这段代码,我们暂且先不用去了解fmt.Println是怎么实现的,只用关心a是怎么取到的,当然是先「找到a之前所做的那个标记」,找到对应的内存所在的位置,直接往后偏移4个位置把值取出来就行。,这下是不是感觉清晰明了了?,我们在上述过程中,所说的「标记」,就是「指针」.所以指针其实就是一个「标记数据所在位置的数据类型而已」,只不过他有一些自己特殊的语法而已,而且是一种新的数据类型。这么来看,就很简单了。,指针是一种「数据类型」,用于表示数据的「内存地址」。,我们来看下面几个例子感受一下,注意:,注意,说明,上面我们通过&name获取到了name的内存空间的地址是0x14000010240,p_name的变量的值实际上是name变量的内存空间的值,p_name也是一个变量 那么p_name变量所存放值的地方,是不是也会有一个内存空间呢?是的,p_name这个指针变量也会指向一个内存空间,大家首先得区分一个概念,「数组指针」和「指针数组」的区别。,简单说数组指针就是整个数组都为指针,直接改变数组的某个元素,不会影响到对应元素的变量。,简单说就是数组每个元素都为指针,当然指针数组和数组指针有很多细节需要注意,如果这篇文章阅读量还可以,咱们后面专门会开一篇讲解这个问题。在这里有个简单的认识即可。希望大家记得多多转发和点赞哦。,大家想象一下最终打印出来的a是123 还是456,当然是123.为什么会这样呢?因为运行到changeData中,把a传进去之后,相当于执行了一步,所以自然对b进行任何修改都不会影响到a,输出的自然是123,在这一次函数参数传递中,相当于执行了,b就是指向a的指针,所以*b修改了,a自然也会跟着修改。,大家知道C语言之所以强大,就是因为c语言支持指针,而且权限特别大,c语言可以对计算机中任何内存的指针进行操作,这样自然而然也会带来一些不安全的因素,所以在golang中,「取消了对指针的一些偏移,翻转等算术运算」(+、-、++、--)所以使用起来更安全。

© 版权声明

相关文章