目录

5.1 Go语言中的指针

基本概念

Go语言中仍然有指针,但是没有指针运算,所以不同于C语言指针,更像是引用。Go语言调用函数时,是传递的值,所以为了提高效率,仍然保留指针。

  • 使用*进行定义,例如:var p *int,现在p是一个指向int类型的指针
  • 所有新声明的变量都分配了相应的零值,指针也不例外。新声明或未指向的指针,值为nil
  • 让指针指向时使用操作符address-of-operator(&)

示例一:指针与地址

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
package main

import "fmt"

func main() {
    var p *int
    fmt.Printf("initial pointer p = %v\n", p)

    var i int
    p = &i
    fmt.Printf("point to int p = %v\n", p)
    fmt.Printf("point to int value p = %v\n", *p)
}

输出如下,在未指向任何变量前p的值为nil,指向整型i后,p的值为地址,p的值为整型的默认值

1
2
3
initial pointer p = <nil>
point to int p = 0xc0000bc000
point to int value p = 0

示例二:指针++

因为指针没有运算,所以*p++等同于(*p)++

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
package main

import "fmt"

func main() {
    var p *int
    var i int

    p = &i

    *p++
    fmt.Printf("*p++ = %v\n", *p)

    (*p)++
    fmt.Printf("(*p)++ = %v\n", *p)
}

输出结果为

1
2
*p++ = 1
(*p)++ = 2