Go 语言指向指针的指针
如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量。
当定义一个指向指针的指针变量时,第一个指针存放第二个指针的地址,第二个指针存放变量的地址:

指向指针的指针变量声明格式如下:
var ptr **int;
以上指向指针的指针变量为整型。
访问指向指针的指针变量值需要使用两个 * 号,如下所示:
package main
import "fmt"
func main() {
var a int
var ptr *int
var pptr **int
a = 3000
/* 指针 ptr 地址 */
ptr = &a
/* 指向指针 ptr 地址 */
pptr = &ptr
/* 获取 pptr 的值 */
fmt.Printf("变量 a = %d\n", a )
fmt.Printf("指针变量 *ptr = %d\n", *ptr )
fmt.Printf("指向指针的指针变量 **pptr = %d\n", **pptr)
}
以上实例执行输出结果为:
变量 a = 3000 指针变量 *ptr = 3000 指向指针的指针变量 **pptr = 3000
Go 指针
Yvettre
dyf***ttre@gmail.com
指向指针的指针的指针
package main import "fmt" func main(){ var a int = 1 var ptr1 *int = &a var ptr2 **int = &ptr1 var ptr3 **(*int) = &ptr2 // 也可以写作:var ptr3 ***int = &ptr2 // 依次类推 fmt.Println("a:", a) fmt.Println("ptr1", ptr1) fmt.Println("ptr2", ptr2) fmt.Println("ptr3", ptr3) fmt.Println("*ptr1", *ptr1) fmt.Println("**ptr2", **ptr2) fmt.Println("**(*ptr3)", **(*ptr3)) // 也可以写作:***ptr3 }执行结果:
a: 1 ptr1 0xc0420140b0 ptr2 0xc042004028 ptr3 0xc042004030 *ptr1 1 **ptr2 1 **(*ptr3) 1Yvettre
dyf***ttre@gmail.com
tscheung
366***550@qq.com
三重指针及其对应关系:
例子:
package main import "fmt" func main(){ var a int = 5 //把ptr指针 指向ss所在地址 var ptr *int = &a //开辟一个新的指针,指向ptr指针指向的地方 var pts *int = ptr //二级指针,指向一个地址,这个地址存储的是一级指针的地址 var pto **int = &ptr //三级指针,指向一个地址,这个地址存储的是二级指针的地址,二级指针同上 var pt3 ***int = &pto 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) }执行结果:
tscheung
366***550@qq.com
冰河
ofy***@qq.com
大家写的还是有点乱,我贴一个简洁的。
多级指针本质上就是一个指针链。
这段代码大家自行执行,打印结果一清二楚。
func t03_test1() { var a int = 5 // 指针 var p1 *int = &a // 二级指针 var p2 **int = &p1 // 三级指针 var p3 ***int = &p2 fmt.Printf("p1的值:%d p1的目标值:%d\n", p1, *p1) fmt.Printf("p2的值:%d p2的目标值:%d p2的链尾目标值:%d\n", p2, *p2, **p2) fmt.Printf("p3的值:%d p3的目标值:%d 下一个目标值:%d p3的链尾目标值:%d\n", p3, *p3, **p3, ***p3) }冰河
ofy***@qq.com