golang多重指针

1,首先看普通指针:

什么是指针?
Runnob:一个指针变量指向了一个值的内存地址
我们知道golang中指针的基本语法是:
通过var Name *type, 开辟指针:
然后通过&操作符使指针指向一个值的内存地址,这个指向的内容可以是一个已经声明好的变量:
var a int = 5
var ptr *int
ptr=&a

通过这种方式,我们创建了一个已经指向了具体内存地址的指针变量
现在我们可以分别查看&ptr, ptr , *ptr的值是什么,直接在fmt.Print()中输出即可:

package main

import "fmt"

func main(){
	var a int=5
	var ptr *int
	ptr = &a
	fmt.Println(&a,&ptr, ptr, *ptr)
}
我这里得到的结果是地址A,地址B,地址A,一个数这种格式的输出结果在这里插入图片描述
可以看出&a和ptr是同样的结果,说明ptr显示的就是他所指向的地址,而&ptr则是该指针自己的存储地址, 而最后*ptr显示的就是指向的地址所对应的变量值。

2,更复杂的多重指针

现在我们已经有一个一个创建好的指针和变量,并且他们已经产生了联系,在使用多重指针之前先看一下这个:
var pts *int
pts = ptr
创建了另一个指针变量并且给他赋值ptr,那对应的&pts, pts, *pts会显示什么结果呢?这个比较简单可以先说答案,最后再看测试结果,他分别对应的是pts指针所在的地址(一个新的地址),pts指向的地址(这里就是a的地址),以及pts指针指向的地址对应的值(同样是a的值)
接下来使用更复杂的二重和三重指针:
	//二级指针,指向一个地址,这个地址存储的是一级指针的地址
	var pto **int = &ptr
	//三级指针,指向一个地址,这个地址存储的是二级指针的地址,二级指针同上
	var pt3 ***int = &pto

这里我创建了一个二级(重)指针,使得他和ptr指针对应的地址绑定也就是说pto这个指针指向了ptr,而对应的三重指针pt3指向了二重指针pto,那么现在的对应关系是

pt3 - > pto - > ptr - > a
接下来依次查看如下内容:
	fmt.Println("a的地址:",&a,
				"\n 值", a, "\n\n",

				"ptr指针所在地址:",&ptr,
				"\n ptr指向的地址:",ptr,
				"\n ptr指针指向地址对应的值",*ptr,"\n\n", 

				"pts指针所在地址:",&pts,
				"\n pts指向的地址:", pts,
				"\n pts指针指向地址对应的值:",*pts,"\n\n", 

				"pto指针所在地址:",&pto,
				"\n pto指向的指针(ptr)的存储地址:",pto, 
				"\n pto指向的指针(ptr)所指向的地址: " ,*pto, 
				"\n pto最终指向的地址对应的值(a)",**pto,"\n\n",

				"pt3指针所在的地址:",&pt3,
				"\n pt3指向的指针(pto)的地址:",pt3,//等于&*pt3,
				"\n pt3指向的指针(pto)所指向的指针的(ptr)地址", *pt3, //等于&**pt3,
				"\n pt3指向的指针(pto)所指向的指针(ptr)所指向的地址(a):",**pt3, //等于&***pt3,
				"\n pt3最终指向的地址对应的值(a)", ***pt3)


返回结果如下:

golang多重指针_第1张图片

这个返回结果可以很清晰地看出这几个指针变量之间对应的关系,并且pt3和&*pt3的值是一样的,下面的三个?的也是如此,这种感觉有点像抵消,实际上我的个人理解是星号和&这两个操作确实是朝着两个方向,这里我表述的不太清楚,可以自行体会。

你可能感兴趣的:(golang)