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)