1.指针

  1. - 一个指针变量指向了一个值的内存地址
  2. - 定义指针变量
  3. - 为指针变量赋值:&
  4. - 修改指针变量中多指向地址的值:*
  1. func main() {
  2. var a int =10 //声明变量
  3. fmt.Printf("a内存地址:%p\n",&a)
  4. var p *int //声明指针
  5. p=&a //p存储a的内存地址
  6. fmt.Println("p存储的地址:",p)
  7. fmt.Println("p自己的内存地址:",&p)
  8. //修改a或者*p的值,所指向同一个地址的变量的值都会变化
  9. a =20
  10. fmt.Println("a的值",a)
  11. fmt.Println("p的值",*p)
  12. *p=30
  13. fmt.Println("a的值",a)
  14. fmt.Println("p的值",*p)
  15. }

2.指针指向指针

  1. - 格式:var p **int
  2. - 一个指针变量存放的是另一个指针变量的地址
  3. - 第一个指针变量存放第二个指针的地址,第二个指针存放变量的地址
  1. func main() {
  2. var a int = 10 //声明普通变量
  3. var ptr *int //声明指针变量
  4. var pptr **int //声明指向指针的指针变量
  5. ptr = &a //将a的地址赋值给ptr
  6. pptr = &ptr //将ptr的地址赋值给pptr
  7. fmt.Printf("a的值是%d,a的地址是%p\n", a, &a)
  8. fmt.Printf("*ptr的值是%d,*ptr存储的地址是%p,*ptr的地址是%p\n", *ptr, ptr, &ptr)
  9. fmt.Printf("**pptr的值是%d,**ptr存储的地址是%p,**ptr的地址是%p\n", **pptr, pptr, &pptr)
  10. **pptr = 20
  11. fmt.Println(a, ",", *ptr) //20,20
  12. }

3.数组指针与指针数组

  1. - 数组指针:是一个指针,指向了数组
  1. func main() {
  2. //创建数组
  3. var a =[4]int{1,2,3,4}
  4. fmt.Printf("数组地址:%p\n",&a)
  5. //创建一个指针,指向数组
  6. var p *[4]int
  7. p=&a
  8. fmt.Printf("p指向的地址:%p\n",p)
  9. fmt.Println("p自己的地址:",&p)
  10. fmt.Println("p指向的值:",*p)
  11. //用数组指针修改数组
  12. //1.原生写法
  13. (*p)[0]=100
  14. fmt.Println(a[0])
  15. //2.简便写法
  16. p[0]=200
  17. fmt.Println(a[0])
  18. }
  1. - 指针数组:是一个数组,保存的指针
  1. func main() {
  2. a:=1
  3. b:=2
  4. c:=3
  5. //创建一个指针数组
  6. var p=[3]*int{&a,&b,&c}
  7. fmt.Println(p)
  8. //通过指针修改a的值
  9. *p[0]=100
  10. fmt.Println(a)
  11. a=200
  12. fmt.Println(*p[0])
  13. }

4.指针函数

  1. - 函数的返回值是指针
  1. func main() {
  2. //调用该函数返回的是一个指针
  3. ptr := p1()
  4. fmt.Println("ptr指向地址的值", *ptr)
  5. fmt.Printf("ptr自己内存地址:%p\n", &ptr)
  6. fmt.Printf("ptr指向的内存地址%p", ptr)
  7. }
  8. //类型为指针的函数
  9. func p1() *[4]int {
  10. arr := [4]int{1, 2, 3, 4}
  11. fmt.Printf("arr地址:%p\n", &arr)
  12. return &arr //返回指针
  13. }

5.指针为函数的参数

  1. - 函数的参数为指针
  1. func main() {
  2. a :=10
  3. fmt.Println("a的地址是",&a)
  4. p1(&a)
  5. }
  6. //参数为指针的函数
  7. func p1(ptr *int) {
  8. fmt.Println("ptr存放的地址是",ptr)
  9. fmt.Println("ptr的值是",*ptr)
  10. }