Go的指针学习笔记 | 青训营笔记

98 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第6篇笔记。

一、指针基本使用

num := 1
&a   //指针地址

声明指针:*T是指针变量的类型,它指向T类型的值。

func Test_14_01(t *testing.T) {
    var a int = 20   /* 声明实际变量 */
    var ip *int        /* 声明指针变量 */
​
    ip = &a  /* 指针变量的存储地址 */
    //*ip = a  //这种赋值方式是错误的!!!,因为ip是指针,我们只能使用*ip来访问值,而不是来进行赋值
    fmt.Printf("a 变量的地址是: %x\n", &a  )
    /* 指针变量的存储地址 */
    fmt.Printf("ip 变量的存储地址: %x\n", ip )
    /* 使用指针访问值 */
    fmt.Printf("*ip 变量的值: %d\n", *ip )
}

image-20220423223623499

注意:禁止出现下面这种形式,会报错

var a *int
//下面这种情况是错误的,当指针为空时不能够直接上来对其进行赋值
*a = 15
//正确做法,只有在指针指向地址了之后才能够对值进行操作
b:=15
a = &b
*a++
*a = 22

二、空指针判断

if(ptr != nil)     /* ptr 不是空指针 */
if(ptr == nil)    /* ptr 是空指针 */

三、数组引用传递案例(指针函数、切片传递)

/**
   三、函数数组修改。①数组指针。②
*/
//方式一:采用指针
func test3(arr *[3]int)  {
   (*arr)[0] = 3
}
​
//方式二:切片。注意:这里不要指定int[]的个数
func test3_02(slice []int)  {
   slice[0] = 4
}
​
func Test_14_03(t *testing.T) {
   nums := [3]int{1,2,3}
   //执行方案一
   test3(&nums)
   fmt.Println(nums)  //[3 2 3]
​
   //执行方案二
   test3_02(nums[:])
   fmt.Println(nums)  //[4 2 3]
}

四、指针数组

/**
   四、指针数组
 */
const MAX = 3
func Test_14_04(t *testing.T) {
   a := []int{10,100,200}
   var i int
   var ptr [MAX]*int;
​
   for  i = 0; i < MAX; i++ {
      ptr[i] = &a[i] /* 整数地址赋值给指针数组 */
   }
​
   for  i = 0; i < MAX; i++ {
      fmt.Printf("a[%d] = %d\n", i,*ptr[i] )  //使用*数组[下标]来访问指针数组中的值
   }
}

五、指针的指针

/**
   五、指针的指针  **
*/
func Test_14_05(t *testing.T) {
   var a int = 3000
   var aa *int
   var aaa **int
​
   aa = &a
   //给**指针,赋值*指针的地址
   aaa = &aa
​
   //一级指针:也就是a的地址
   fmt.Println(aa)  //0xc00000a358
   //*aaa:相当于表示aa
   fmt.Println(*aaa)  //0xc00000a358
   //**aaa:表示a
   fmt.Println(**aaa)  //3000
}

案例:使用指针函数来交换两数

/**
    六、使用指针函数来交换两数
*/
func swap(a *int, b *int)  {
    var temp = *a
    *a = *b
    *b = temp
}
func Test_14_06(t *testing.T) {
    a := 10
    b := 15
    swap(&a, &b)
    fmt.Println(a)  //15
    fmt.Println(b)  //10
}