demo.go(定义指针变量):
package main
import "fmt"
func main() {
a := 100 // int类型
fmt.Printf("%p \n", &a) // 0xc00004c080
// 定义指针变量
var p *int = &a
fmt.Printf("%p \n", p) // 0xc00004c080 p指针变量本身就是一个地址,不需要&取其地址
// 通过指针p修改变量a的值 (*表示取指针指向的值)
*p = 123
fmt.Println(a) // 123
// p *p a &a
fmt.Println(p) // 0xc00004c080 (地址)
fmt.Println(*p) // 123 (值)
fmt.Println(a) // 123 (值)
fmt.Println(&a) // 0xc00004c080 (地址)
// 声明指针变量 (第二种方式定义指针变量)
var p2 *int // 指针变量的默认值是0x0(nil 空指针) (0x0内存地址为0 0-255的空间为系统占用,不允许用户访问(读写))
fmt.Println(p2) // <nil>
// *p2 = 111 // 会报错。 空指针(nil)不能进行引用。
p2 = new(int) // new(数据类型) 表示开辟内存空间,返回指针类型。 (go语言中,没有被引用的内存空间会自动释放(引用计数))
fmt.Println(p2) // 0xc00004c0c0
*p2 = 111 // 不会报错。 p2不是空指针(nil)
}