Golang 菜鸟教程

Golang 控制语句

Golang 函数 & 方法

Golang 结构体

Golang 切片 & 数组

Golang 字符串(String)

Golang 指针

Golang 接口

Golang 并发

Golang 异常(Error)

Golang 其他杂项

Go 指针指向指针(双指针)

Go编程语言中的指针是一个变量,用于存储另一个变量的内存地址。指针是一个特殊的变量,因此它甚至可以指向任何类型的变量。基本上,这看起来像是一个指针链。当我们定义一个指向指针的指针时,第一个指针将用于存储第二个指针的地址。这个概念有时被称为双指针

如何在Golang中声明指向指针的指针?
将指针声明为Pointer类似于在Go中声明指针。区别在于我们必须在指针名称的名称之前放置一个额外的' * '。通常,当我们使用var关键字和类型声明指针变量时,就可以完成此操作。

示例1:在下面的程序中,指针pt2存储pt1指针的地址。解引用pt2* pt2将给出变量v的地址,或者您也可以说指针pt1的值。如果您尝试** pt2,那么将给出变量v的值,即100。

package main

import "fmt"

func main() {

    //整数类型变量
    var V int = 100

    //获取一个指针
    //的整数类型
    var pt1 *int = &V

    //获取指向的指针
    //指向pt1的指针存储地址
    //将pt1转化为pt2
    var pt2 **int = &pt1

    fmt.Println("变量V的值为 = ", V)
    fmt.Println("变量V的地址为 = ", &V)

    fmt.Println("pt1的值为 = ", pt1)
    fmt.Println("pt1地址为 = ", &pt1)

    fmt.Println("pt2的值为 = ", pt2)

    //解引用
    //指向指针的指针
    fmt.Println("pt2地址的值为(*pt2) = ", *pt2)

    //双指针将给出变量V的值
    fmt.Println("*(pt2地址处的值为) 或 **pt2 = ", **pt2)
}

输出:

变量V的值为 =  100
变量V的地址为 =  0xc000062090
pt1的值为 =  0xc000062090
pt1地址为 =  0xc00008c018
pt2的值为 =  0xc00008c018
pt2地址的值为(*pt2) =  0xc000062090
*(pt2地址处的值为) 或 **pt2 =  100

示例2:让我们在上面的程序中进行一些更改。通过使用解引用更改指针的值来为指针分配一些新值,如下所示:

// Go程序来说明指针指向指针的概念
package main

import "fmt"

func main() {

    // 定义int类型变量
    var v int = 100

    // 一个整数类型的指针
    var pt1 *int = &v

    //获取指向的指针
    //指向pt1的指针存储地址
    //将pt1转化为pt2
    var pt2 **int = &pt1

    fmt.Println("变量v的值为 = ", v)

    //通过赋值来更改v的值
    //指向指针pt1的新值
    *pt1 = 200

    fmt.Println("更改pt1后存储在v中的值 = ", v)

    //通过赋值来更改v的值
    //指向指针pt2的新值
    **pt2 = 300

    fmt.Println("更改pt2后存储在v中的值 = ", v)
}

输出:

变量v的值为 =  100
更改pt1后存储在v中的值 =  200
更改pt2后存储在v中的值 =  300

相关知识:Go 指针