跳转至

11 golang 基础语法之指针

Golang 指针

go 语言指针可以用来更加简单的执行任务

变量是使用方便的占位符, 用于引用计算机内存地址

golang 语言取地址符是 &, 放到一个变量前就会返回相应变量的地址

示例代码

package main

import "fmt"

func main() {
    var pointer int = 100

    fmt.Printf("变量 pointer 的内存地址是: %x\n", &pointer)

}

运行结果

$ go run pointer_trading.go
变量 pointer 的内存地址是: 14000126008

什么是指针

  • 指针变量指向一个值的内存地址
  • 使用指针时需要声明, 格式如下
var var_name *var_type

例子:

var ip *int
var str *string

如何使用指针

使用流程

  • 定义指针变量
  • 为指针变量赋值
  • 访问指针变量中指向的地址

在指针类型前面加上* 前缀 来获取指针所指向的内容

package main

import "fmt"

func main() {
    var pointer int = 100
    var tmp *int

    tmp = &pointer


    fmt.Printf("变量 pointer 的内存地址是: %x\n", &pointer)
    fmt.Printf("变量 *tmp 的存储指针地址是: %x\n", tmp)
    fmt.Printf("变量 *tmp 的指向的值是: %d\n", *tmp)

}

运行结果

$ go run pointer_trading.go
变量 pointer 的内存地址是: 14000126008
变量 *tmp 的存储指针地址是: 14000126008
变量 *tmp 的指向的值是: 100

golang 空指针

当一个指针被定义后, 没有分配任何变量时, 它的值是nil;

nil 指针也叫空指针

指针变量通常缩写为ptr

package main

import "fmt"

func main() {
    var tmp *int

    fmt.Printf("变量 tmp 的指向的值是: %x\n", tmp)

}

输出结果

$ go run pointer_trading.go
变量 tmp 的指向的值是: 0

判断空指针

if(ptr != nil)     /* ptr 不是空指针 */
if(ptr == nil)    /* ptr 是空指针 */

指针数组

package main

import "fmt"

const MAX int = 3

func main() {
    a := []int{1,20,300}
    var i int

    for  i=0; i< MAX; i++ {
        fmt.Printf("a[%d] = %d\n", i, a[i])
    }

运行结果

$  go run pointer_trading.go
a[0] = 1
a[1] = 20
a[2] = 300

当有一种情况时, 我们需要保存数组, 这样就需要用到指针

声明指针类型数组如下

var ptr [MAX]*int

Ptr 为整型的指针数组, 因此每一个原属都指向了一个值, 一下示例将三个证书存储在指针数组中

package main

import "fmt"

const MAX int = 3

func main() {
    a := []int{1, 20, 300}
    var i int
    var ptr [MAX]*int
    for i=0; i<MAX; i++ {
        ptr[i] = &a[i]
    }
    for i = 0; i < MAX; i++ {
        fmt.Printf("a[%d] = %d\n", i, *ptr[i])
    }
}

运行结果为

$ go run pointer_trading.go
a[0] = 1
a[1] = 20
a[2] = 300

golang 指向指针的指针(双指针)

指针变量存放的是另一个指针变量的地址, 称这个指针变量为指向指针变量

img

定义方式如下

var ptr **int

指向指针变量需要在前面加上2个*

例子:

package main

import "fmt"

const MAX int = 3

func main() {
    var a int = 100
    var ptr *int
    var pptr **int

    ptr = &a
    pptr = &ptr

    fmt.Printf("a 的值是: %d\n", a)
    fmt.Printf("ptr 指向的地址是: %x\n", ptr)
    fmt.Printf("pptr 指向的地址是: %x\n", pptr)
    fmt.Printf("ptr 指向的值是: %d\n", *ptr)
    fmt.Printf("pptr 指向的值是: %d\n", **pptr)

}

go 指针作为函数参数

go 语言允许向函数传递指针, 只需要在函数定义上设置成指针即可

package main

import "fmt"

const MAX int = 3

func swap (x *int, y *int) {
    var tmp int
    tmp = *x
    *x = *y
    *y = tmp
}

func main() {

    var a, b int = 10, 20 

    swap(&a, &b)

    fmt.Printf("a 的值是: %d\n", a)
    fmt.Printf("b 的值是: %d\n", b)

}