一个指针变量指向了一个值的内存地址。
var var_name *var-type
var ip *int /* 指向整型*/
var fp *float32 /* 指向浮点型 */
指针有3个概念: 指针地址、指针类型和指针取值。
记住2个符号: &
取变量的内存地址和*
取变量的内存地址的值
x := 1
p := &x // p的类型为 *int, 指针指向 x
fmt.Println(*p) // "1"
*p = 2 // 更改p的值 x = 2
fmt.Println(x) // "2"
任何类型的指针的零值都是nil。如果p指向某个有效变量,那么p != nil
测试为真。指针之间也是可以进行相等测试的,只有当它们指向同一个变量或全部是nil时才相等。
var x, y int
fmt.Println(&x == &x, &x == &y, &x == nil) // "true false false"
练习
package main
import "fmt"
func main() {
a := 2
b := a
fmt.Println(a, b) // 2 2
b = 3
fmt.Println(a, b) // 2 3
a = 4
fmt.Println(a, b) // 4 3
// 指针
// &取内存地址
// *取内存地址的值
var c *int = &a
ptr := &a
fmt.Printf("%T %T %p %v\n", ptr, c, ptr, c)
fmt.Println(a) // 4
fmt.Println(*c) // 4
*c = 99
fmt.Println(a) // 99
var ptr1 *int
fmt.Printf("ptr1 指针的值为: %x\n", ptr1)
fmt.Printf("ptr1: %#v\n", ptr1)
if ptr1 != nil {
fmt.Println("ptr1 != nil")
} else {
fmt.Println("ptr1 == nil")
}
var pa int = 2 //声明变量
var pb *int //声明指针变量
pb = &pa //指针变量的存储地址
fmt.Printf("a 变量的内存地址: %x\n", pb)
fmt.Printf("b 变量的内存地址: %x\n", pb)
fmt.Printf("b 变量的内存地址的值: %d\n", *pb)
}