# Golang 指针

# 一、Golang 指针概念

# 1. 指针的概念

指针是存储另一个变量的内存地址的变量。

我们都知道,变量是一种使用方便的占位符,用于引用计算机内存地址。

一个指针变量可以指向任何一个值的内存地址它指向那个值的内存地址。

image-20210721193530046

在上面的图中,变量 b 的值为 156,存储在内存地址 0x1040a124。变量 a 持有 b 的地址,现在 a 被认为指向 b。

# 2. 获取变量地址

Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址。

package main

import "fmt"

func main() {
   var a int = 10   

   fmt.Printf("变量的地址: %x\n", &a  )
}

输出:

变量的地址: 20818a220

# 二、Golang 指针声明

声明指针,*T 是指针变量的类型,它指向 T 类型的值。

var var_name *var_type

var_type 为指针类型,var_name 为指针变量名,* 号用于指定变量是作为一个指针。

var ip *int        /* 指向整型*/
var fp *float32    /* 指向浮点型 */

示例代码:

package main

import "fmt"

func main() {
   var a int= 20   /* 声明实际变量 */
   var ip *int        /* 声明指针变量 */

   ip = &a  /* 指针变量的存储地址 */

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

   /* 指针变量的存储地址 */
   fmt.Printf("ip 变量的存储地址: %x\n", ip )

   /* 使用指针访问值 */
   fmt.Printf("*ip 变量的值: %d\n", *ip )
}

输出:

a 变量的地址是: 20818a220
ip 变量的存储地址: 20818a220
*ip 变量的值: 20

补充:

  • 当一个指针被定义后没有分配到任何变量时,它的值为 nil。
  • nil 指针也称为空指针。
  • nil 在概念上和其它语言的null、None、nil、NULL一样,都指代零值或空值。
  • 一个指针变量通常缩写为 ptr。

# 三、Golang 指针操作

# 1. 获取指针的值

获取一个指针意味着访问指针指向的变量的值。语法是:*a

package main  
import (  
    "fmt"
)

func main() {  
    b := 255
    a := &b
    fmt.Println("address of b is", a)
    fmt.Println("value of b is", *a)
}

# 2. 操作指针改变变量的值

package main

import (  
    "fmt"
)

func main() {  
    b := 255
    a := &b
    fmt.Println("address of b is", a)
    fmt.Println("value of b is", *a)
    *a++
    fmt.Println("new value of b is", b)
}

输出:

address of b is 0x1040a124  
value of b is 255  
new value of b is 256  

# 3. 使用指针传递函数的参数

package main

import (  
    "fmt"
)

func change(val *int) {  
    *val = 55
}
func main() {  
    a := 58
    fmt.Println("value of a before function call is",a)
    b := &a
    change(b)
    fmt.Println("value of a after function call is", a)
}

输出:

value of a before function call is 58  
value of a after function call is 55  
上次更新: 7/27/2021, 6:41:10 PM