一、指针的定义

跟C语言一样,使用 * 定义指针:

  1. var num int = 10
  2. var numPoint *int = &num
  3. fmt.Printf("num 的值: %d \n", num)
  4. fmt.Printf("num 的地址: %x \n", &num)
  5. fmt.Printf("numPoint 指向的地址: %x \n", numPoint)
  6. fmt.Printf("numPoint 指向的地址的值: %d \n", *numPoint)

打印出:

num 的值: 10
num 的地址: c0000140a0
numPoint 指向的地址: c0000140a0
numPoint 指向的地址的值: 10

如果定义一个指针却没给它赋值,此指针的值为 nil

  var numPoint *int
  fmt.Printf("%x \n", numPoint) // 0
  fmt.Println(numPoint) // <nil>

由此,判断一个指针时候为空就应该这样写:

var numPoint *int
if numPoint != nil {
    fmt.Println("numPoint != nil")
} else {
    fmt.Println("numPoint is nil")
}

二、数组指针

数组指针是一个指向数组的指针:

  arr := [...]int {1,2,3}
  arrPoint := &arr
  fmt.Println("arrPoint 的值:", arrPoint)
  fmt.Println("arrPoint 的地址:", *arrPoint)

输出:

arrPoint 的值: &[1 2 3]
arrPoint 的地址: [1 2 3]

要取出数组指针中某一项指针指向的地址的值,需要添加括号后取出:

fmt.Println((*arrPoint)[0]) // 同arr[0]
fmt.Println((*arrPoint)[1]) // 同arr[1]
fmt.Println((*arrPoint)[2]) // 同arr[2]

要取出某项指针指向的地址,再在前面添加 & 符号:

fmt.Println(&(*arrPoint)[0]) // 同&arr[0]
fmt.Println(&(*arrPoint)[1]) // 同&arr[1]
fmt.Println(&(*arrPoint)[2]) // 同&arr[2]

三、指针数组

指针数组是一个包含若干指针的数组:

  a, b, c := 1, 2, 3
  pointArr := [...]*int {&a,&b,&c}
  fmt.Println("pointArr:", pointArr)
  fmt.Println("*pointArr[0]:", *pointArr[0])
  fmt.Println("*pointArr[1]:", *pointArr[1])
  fmt.Println("*pointArr[2]:", *pointArr[2])

输出:

pointArr: [0xc0000140a0 0xc0000140a8 0xc0000140b0]
*pointArr[0]: 1
*pointArr[1]: 2
*pointArr[2]: 3