指针

指针

  1. 概念

    存储另一个变量的内存地址的变量

  2. 获取变量地址

    Go语言的取地址符是&,放到一个变量前使用返回相应的变量的内存地址

  3. 声明指针

    *T是指针变量的类型,它指向T类型的值

    var var_name *var_type
    
  4. 获取指针的值

    获取一个指针意味着访问可访问指针指向的变量的值。

    语法为:
    *pointer
    
  5. 操作变量

    操作变量,更改数值,并不会更改变量的地址

  6. 通过指针操作变量

    通过指针修改数值,也不会更改变量的地址

  7. 指针的指针

    存放另一个指针变量地址的变量

    var a **p
    b := 10
    c := &b
    a = &c
    
  8. 数组指针

    首先是一个指针,存储了一个数组的地址

    *[4]Type

    s := [4]int{1,2,3,4}
    sp := &s
    fmt.Println(sp) //&[1 2 3 4] 打印出指针sp的字符表示形式
    fmt.Printf("%p
    ",sp) //打印数组s的地址
    fmt.Printf("%p
    ",&sp) //打印指针sp的地址
    
    //通过指针操作数组
    (*sp)[0]=100
    fmt.Println(s[0]) //100
    sp[0]=200 //简化写法
    fmt.Println(s[0]) //200
    
  9. 指针数组

    首先是一个数组,存储的数据类型是指针

    [4]*Type

    a := 1
    b := 2
    c := 3
    d := 4
    arr2 := [4]int{a,b,c,d} //数组arr2中存放的是变量a,b,c,d的副本,说明是通过值传递方式创建的数组
    arr3 := [4]*int{&a,&b,&c,&d} 
    
  10. 函数指针

    1. 首先是一个指针,指向了一个函数的指针

      因为go语言中,function,默认看作一个指针,没有*

      func f(){}
      //函数名f本身就是个函数指针,存储了函数体的地址
      
    2. 默认引用类型的类型

      slice,map,function

  11. 指针函数

    首先是一个函数,该函数的返回值是一个指针

    func fun2() *[4]int{
    	arr := [4]int{1,2,3,4}
    	return &arr
    }
    
  12. 指针作为参数

    指针因为是引用类型,所以作为参数传递参数地址,通过指针能直接修改源数据。

  13. 注意

    指针只是针对非引用类型使用,如slice等引用类型没必要使用指针

原文地址:https://www.cnblogs.com/henryno12/p/12688005.html